2 回答

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
方法的接收器類型不能是指向指針的指針,但這就是您所寫的:
func (m *arrayTypePt) change() { m[1] = "W" }
arrayTypePt已經(jīng)是一個(gè)指針*[3]string。引用語言規(guī)范:
[接收者] 類型必須是形式T或*T(可能使用括號) whereT是類型名稱。表示的類型T稱為接收器基類型;它不能是指針或接口類型,并且必須在與方法相同的包中聲明。
你的第二個(gè)錯(cuò)誤(“type *arrayTypePt 不支持索引”)也是這個(gè)結(jié)果(m是一個(gè)指向指針的指針,這就是你不能索引它的原因;如果它只是一個(gè)指向數(shù)組或切片的指針,指針間接將是自動的)。
你的第三個(gè)錯(cuò)誤只是一個(gè)錯(cuò)字,你聲明了一個(gè)名為change()and not的方法changeArray4()。
所以你應(yīng)該只命名非指針數(shù)組類型:
type arrayType [3]string
您可以直接使用此類型聲明數(shù)組:
var array = arrayType{"A", "B", "C"}
你可以簡單地調(diào)用它的change()方法:
array.change()
數(shù)組的地址將被自動獲?。ㄒ?yàn)樵揷hange()方法有一個(gè)指針接收器,但array變量本身不是一個(gè)指針)。
在Go Playground上試一試。
注釋/替代品
如果您希望您的array變量顯式為[3]string,您仍然可以通過將其轉(zhuǎn)換為arrayType,將其設(shè)置為另一個(gè)變量來使其工作,并且change()可以在 this 上調(diào)用(因?yàn)樗且粋€(gè)變量,它的地址可以被獲取 - 而轉(zhuǎn)換的地址喜歡arrayType(arr)不能):
arr2 := [3]string{"A", "B", "C"}
arr3 := arrayType(arr2)
arr3.change()
或者,如果您將變量聲明為指向 type 的指針[3]string,您可以保存所需的附加變量(這只是必需的,以便我們能夠獲取其地址):
arr4 := new([3]string)
*arr4 = [3]string{"A", "B", "C"}
((*arrayType)(arr4)).change()
在Go Playground上也可以嘗試這些變體。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果您將數(shù)組/切片變量定義為接收器類型,則它工作正常:
type arrayType [3]string
var array arrayType = [3]string{"A", "B", "C"} # note "arrayType" here
func (m *arrayType) change() { m[1] = "W" }
func main() {
array.change()
}
我不確定為什么類型轉(zhuǎn)換的行為如此。
- 2 回答
- 0 關(guān)注
- 215 瀏覽
添加回答
舉報(bào)