Pointers 方法的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

我可以将数组及其指针用于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 (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
的指针,则可以保存所需的附加变量(该变量是必需的,以便我们能够获取其地址):

在手机上也可以尝试这些变体