pointers - Go array for method -
can use array , pointer go methods?
i have following code:
var array = [3]string{"a", "b", "c"} type arraytypept *[3]string func (m *arraytypept) change() { m[1] = "w" } func main() { (arraytypept(&array)).changearray4() } but code: http://play.golang.org/p/mxdehma9wk
give me error of:
invalid receiver type *arraytypept (arraytypept pointer type) invalid operation: m[1] (type *arraytypept not support indexing) arraytypept(&array).changearray4 undefined (type arraytypept has no field or method changearray4) i same error when try slice. why cannot in method?
the receiver type of method cannot pointer pointer, wrote:
func (m *arraytypept) change() { m[1] = "w" } arraytypept pointer *[3]string. quoting language specification:
[the receiver] type must of form
tor*t(possibly using parentheses)ttype name. type denotedtcalled receiver base type; it must not pointer or interface type , must declared in same package method.
your 2nd error ("type *arraytypept not support indexing") result of (m pointer pointer, that's why can't index it; if pointer array or slice, pointer indirection automatic).
your 3rd error typo, declared method named change() , not changearray4().
so should name non-pointer array type:
type arraytype [3]string and can declare array using directly type:
var array = arraytype{"a", "b", "c"} and can call change() method:
array.change() the address of array taken automatically (because change() method has pointer receiver array variable not pointer).
try on go playground.
notes / alternatives
if want array variable explicitly [3]string, still make work converting arraytype, setting variable, , change() can called on (because being variable address can taken - while address of conversion arraytype(arr) cannot):
arr2 := [3]string{"a", "b", "c"} arr3 := arraytype(arr2) arr3.change() or if declare variable pointer type [3]string, save required additional variable (which required able take address):
arr4 := new([3]string) *arr4 = [3]string{"a", "b", "c"} ((*arraytype)(arr4)).change() try these variants on go playground.
Comments
Post a Comment