Pointers 方法的Go数组
我可以将数组及其指针用于Go方法吗 我有以下代码:Pointers 方法的Go数组,pointers,methods,go,Pointers,Methods,Go,我可以将数组及其指针用于Go方法吗 我有以下代码: var array = [3]string{"A", "B", "C"} type arrayTypePt *[3]string func (m *arrayTypePt) change() { m[1] = "W" } func main() { (arrayTypePt(&array)).changeArray4() } 但是这个代码: 给我一个错误: invalid receiver type *arrayTypePt
var array = [3]string{"A", "B", "C"}
type arrayTypePt *[3]string
func (m *arrayTypePt) change() { m[1] = "W" }
func main() {
(arrayTypePt(&array)).changeArray4()
}
但是这个代码:
给我一个错误:
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)
当我尝试使用slice时,我得到了相同的错误。
为什么我不能在方法中执行此操作?如果将数组/切片变量定义为接收器类型,则效果良好:
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()
}
我不确定为什么类型转换的行为与之类似。如果将数组/切片变量定义为接收器类型,则效果很好:
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()
}
我不确定为什么类型转换的行为与之类似。方法的接收器类型不能是指向指针的指针,但这就是您所写的:
func (m *arrayTypePt) change() { m[1] = "W" }
arrayTypePt
已经是一个指针*[3]字符串
。引述:
[接收方]类型必须为T
或*T
(可能使用括号),其中T
是类型名称。用T
表示的类型称为接收机基本类型它不能是指针或接口类型,并且必须在与方法相同的包中声明
您的第二个错误(“type*arrayTypePt不支持索引”)也是这一错误的结果(m
是指向指针的指针,这就是为什么您不能对它进行索引;如果它只是指向数组或切片的指针,则指针间接寻址将是自动的)
您的第三个错误只是输入错误,您声明了一个名为change()
的方法,而不是changearay4()
因此,您应该只命名非指针数组类型:
type arrayType [3]string
您可以直接使用以下类型声明数组:
var array = arrayType{"A", "B", "C"}
您只需调用它的change()
方法:
array.change()
数组的地址将被自动获取(因为change()
方法有一个指针接收器,但是array
变量本身不是指针)
试穿一下
注释/备选方案
如果您希望将数组
变量显式地设置为[3]字符串
,您仍然可以将其转换为数组类型
,将其设置为另一个变量,并在此变量上调用change()
(因为作为一个变量,它的地址是可以取的,而像arrayType(arr)
这样的转换的地址是不能取的):
或者,如果您将变量声明为指向类型[3]string
的指针,则可以保存所需的附加变量(该变量是必需的,以便我们能够获取其地址):
也可以在上尝试这些变体。方法的接收器类型不能是指向指针的指针,但这是您编写的:
func (m *arrayTypePt) change() { m[1] = "W" }
arrayTypePt
已经是一个指针*[3]字符串
。从以下位置引用:
[接收器]类型必须是T
或*T
(可能使用括号)的形式,其中T
是一个类型名称。由T
表示的类型称为接收器基类型;它不能是指针或接口类型,并且必须在与方法相同的包中声明
您的第二个错误(“type*arrayTypePt不支持索引”)也是这一错误的结果(m
是指向指针的指针,这就是为什么您不能对它进行索引;如果它只是指向数组或切片的指针,则指针间接寻址将是自动的)
您的第三个错误只是输入错误,您声明了一个名为change()
的方法,而不是changearay4()
因此,您应该只命名非指针数组类型:
type arrayType [3]string
您可以直接使用以下类型声明数组:
var array = arrayType{"A", "B", "C"}
您只需调用它的change()
方法:
array.change()
数组的地址将被自动获取(因为change()
方法有一个指针接收器,但是array
变量本身不是指针)
试穿一下
注释/备选方案
如果您希望将数组
变量显式地设置为[3]字符串
,您仍然可以将其转换为数组类型
,将其设置为另一个变量,并在此变量上调用change()
(因为作为一个变量,它的地址是可以取的,而像arrayType(arr)
这样的转换的地址是不能取的):
或者,如果您将变量声明为指向类型[3]string
的指针,则可以保存所需的附加变量(该变量是必需的,以便我们能够获取其地址):
在手机上也可以尝试这些变体