golang, methods on values or pointers?
package main import "fmt" type t struct { s string } func (o t) f1() { o.s = "f1" } func (p *t) f2() { p.s = "f2" } func main() { t1 := t{ s: "t1",} fmt.Println("t1:",t1.s) t1.f1() fmt.Println("t1:",t1.s) t2 := t{ s: "t2",} fmt.Println("t2:",t2.s) t2.f2() fmt.Println("t2:",t2.s) } // t1: t1 // t1: t1 // t2: t2 // t2: f2 http://golang.org/doc/faq#methods_on_values_or_pointers (官方FAQ) Should I define methods on values or pointers?func (s *MyStruct) pointerMethod() { } // method on pointer func (s MyStruct) valueMethod() { } // method on value For programmers unaccustomedto pointers,the distinctionbetween these two examples can be confusing,but the situationis actually very simple. When defininga method on a type,the receiver( First,and most important,does the method need to modify the receiver? If it does,the receivermustbe a pointer. (Slices and mapsact as references,so their story is a little more subtle,but for instance to change the length of a slicein a method the receiver must still be a pointer.) In the examplesabove,if By the way,pointer receivers are identicalto the situationin Java,although in Java the pointers are hidden under the covers; it's Go's value receivers that are unusual. Second is the considerationof efficiency. If the receiver is large,a big Next is consistency. If some of the methods of the type must have pointer receivers,the rest should too,so the method set is consistentregardless of how the type is used. See the section onmethod setsfor details. For types such as basic types,slices,and small (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |