2 回答
TA贡献1891条经验 获得超3个赞
方法的接收器类型不能是指向指针的指针,但这就是您所写的:
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上也可以尝试这些变体。
TA贡献1875条经验 获得超5个赞
如果您将数组/切片变量定义为接收器类型,则它工作正常:
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()
}
我不确定为什么类型转换的行为如此。
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报