转到方法数组

我可以将数组及其指针用于 Go 方法吗?


我有以下代码:


var array = [3]string{"A", "B", "C"}

type arrayTypePt *[3]string

func (m *arrayTypePt) change() { m[1] = "W" }

func main() {

    (arrayTypePt(&array)).changeArray4()

}

但是这段代码:http : //play.golang.org/p/mXDEhmA9wk


给我一个错误:


invalid receiver type *arrayTypePt (arrayTypePt is a pointer type)

invalid operation: m[1] (type *arrayTypePt does not support indexing)

arrayTypePt(&array).changeArray4 undefined (type arrayTypePt has no field or method changeArray4)

当我用切片尝试这个时,我得到了同样的错误。为什么我不能在方法中做到这一点?


有只小跳蛙
浏览 176回答 2
2回答

万千封印

方法的接收器类型不能是指向指针的指针,但这就是您所写的:func (m *arrayTypePt) change() { m[1] = "W" }arrayTypePt已经是一个指针*[3]string。引用语言规范:[接收者] 类型必须是形式T或*T(可能使用括号) whereT是类型名称。表示的类型T称为接收器基类型;它不能是指针或接口类型,并且必须在与方法相同的包中声明。你的第二个错误(“type *arrayTypePt 不支持索引”)也是这个结果(m是一个指向指针的指针,这就是你不能索引它的原因;如果它只是一个指向数组或切片的指针,指针间接将是自动的)。你的第三个错误只是一个错字,你声明了一个名为change()and not的方法changeArray4()。所以你应该只命名非指针数组类型:type arrayType [3]string您可以直接使用此类型声明数组:var array = arrayType{"A", "B", "C"}你可以简单地调用它的change()方法:array.change()数组的地址将被自动获取(因为该change()方法有一个指针接收器,但array变量本身不是一个指针)。在Go Playground上试一试。注释/替代品如果您希望您的array变量显式为[3]string,您仍然可以通过将其转换为arrayType,将其设置为另一个变量来使其工作,并且change()可以在 this 上调用(因为它是一个变量,它的地址可以被获取 - 而转换的地址喜欢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上也可以尝试这些变体。

慕田峪4524236

如果您将数组/切片变量定义为接收器类型,则它工作正常:type arrayType [3]stringvar array arrayType = [3]string{"A", "B", "C"}   # note "arrayType" herefunc (m *arrayType) change() { m[1] = "W" }func main() {    array.change()}我不确定为什么类型转换的行为如此。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go