我可以将数组及其指针用于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时,出现相同的错误。为什么我不能用方法做到这一点?
方法的接收方类型不能是指向指针的指针,但这就是您编写的:
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上也尝试这些变体。
归档时间: |
|
查看次数: |
582 次 |
最近记录: |