我正在使用自定義類型,當涉及如下指針時,我遇到了問題。以下代碼有效:package mainimport ( "fmt")type deck []stringfunc newDeck(cards ...string) deck { return cards}下面的代碼也是有效的:package mainfunc str(n []string) *[]string {return &n}以下代碼無效。為什么這樣?我必須寫一個類型轉換return (*deck)(&cards)package mainimport ( "fmt")type deck []stringfunc newDeck(cards ...string) *deck { return &cards // compiles with return (*deck)(&cards)}
1 回答

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
關于賦值(包括返回)的規則在Go 規范中定義:Assignability。與您的情況相關的是:
V
并且T
具有相同的基礎類型,并且 V 或 T 中至少有一個不是命名類型。
和基礎類型:
如果 T 是預先聲明的布爾值、數字或字符串類型之一,或者是文字類型,則對應的基礎類型是 T 本身。
第一個示例編譯是因為它是一個具有底層類型(本身)[]string
的未命名類型文字,并且是一個具有底層類型(根據您的類型定義)的命名類型。[]string
deck
[]string
第二個示例無法編譯,因為*[]string
和*deck
都是未命名的類型文字,它們本身是(不同的)基礎類型。
要使第二個示例編譯,您不能依賴直接賦值,但正如您發現的那樣,使用顯式類型轉換
return (*deck)(&cards)
由于以下規則,此轉換有效:
忽略 struct 標記(見下文),
x
的類型 和T
是未命名類型的指針類型,它們的指針基類型不是類型參數但具有相同的基礎類型。
- 1 回答
- 0 關注
- 98 瀏覽
添加回答
舉報
0/150
提交
取消