为了账号安全,请及时绑定邮箱和手机立即绑定

转到方法数组

转到方法数组

Go
有只小跳蛙 2021-10-11 10:40:01
我可以将数组及其指针用于 Go 方法吗?我有以下代码:var array = [3]string{"A", "B", "C"}type arrayTypePt *[3]stringfunc (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)当我用切片尝试这个时,我得到了同样的错误。为什么我不能在方法中做到这一点?
查看完整描述

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上也可以尝试这些变体。


查看完整回答
反对 回复 2021-10-11
?
慕田峪4524236

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()

}

我不确定为什么类型转换的行为如此。


查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信