去数组的方法

0 methods pointers 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()
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码: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)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用slice时,出现相同的错误。为什么我不能用方法做到这一点?

icz*_*cza 5

方法的接收方类型不能是指向指针的指针,但这就是您编写的:

func (m *arrayTypePt) change() { m[1] = "W" }
Run Code Online (Sandbox Code Playgroud)

arrayTypePt已经是一个指针*[3]string。引用语言规范

[接收方]类型必须为以下形式T*T(可能使用括号),其中T是类型名称。表示的类型T称为接收方基本类型;它不能是指针或接口类型,并且必须在与方法相同的程序包中声明。

您的第二个错误(“ type * arrayTypePt类型不支持索引”)也是这种情况的结果(m是指向指针的指针,这就是为什么您无法对其进行索引;如果仅是指向数组或切片的指针,则该指针间接操作将是自动的)。

您的第三个错误只是一个错字,您声明了一个名为change()和不是的方法changeArray4()

因此,您仅应命名非指针数组类型:

type arrayType [3]string
Run Code Online (Sandbox Code Playgroud)

您可以直接使用以下类型声明数组:

var array = arrayType{"A", "B", "C"}
Run Code Online (Sandbox Code Playgroud)

您可以简单地调用其change()方法:

array.change()
Run Code Online (Sandbox Code Playgroud)

数组的地址将被自动获取(因为该change()方法具有指针接收器,但array变量本身不是指针)。

Go Playground上尝试一下。

注释/替代

如果您希望array变量是显式的[3]string,则仍可以通过将其转换为arrayType,将其设置为另一个变量来使其起作用,并change()可以对此进行调用(因为作为变量,可以使用其地址-转换地址)就像arrayType(arr)不能):

arr2 := [3]string{"A", "B", "C"}
arr3 := arrayType(arr2)
arr3.change()
Run Code Online (Sandbox Code Playgroud)

或者,如果您将变量声明为type的指针[3]string,则可以保存所需的其他变量(仅是必需的,这样我们才能获取其地址):

arr4 := new([3]string)
*arr4 = [3]string{"A", "B", "C"}
((*arrayType)(arr4)).change()
Run Code Online (Sandbox Code Playgroud)

Go Playground上也尝试这些变体。