type F interface { f() }
type S1 struct { myValue int } func (s S1) f() { fmt.Printf("%d\n", s.myValue) } func (s *S1) fpoint() { fmt.Printf("%d\n", s.myValue) }
type S2 struct { myValue int } func (s *S2) f() { fmt.Printf("%d\n", s.myValue) }
func main() { //1.值传递 val := S1{20} //函数赋值时,初始带入的是第一个隐形参数是val对象本身 //因此这里发生了一次拷贝,当对象本身很大时,不建议使用类型本身作为receiver m := val.f m1 := val.fpoint //数值发生改变 val.myValue = 12 //20 m() //12 m1() //接口需要实现f() var pInter F pInter = S1{10} pInter.f() pInter = &S1{12} pInter.f() pInter = &S2{13} pInter.f() //pInter = S2{24} }
/* 1.要修改实例状态,用*T 2.无须修改状态的小对象或固定值,建议用T 3.大对象建议用*T,以减少复制成本 4.引用类型、字符串、字典、函数等指针包装对象,直接用T 5.若包含Mutex等同步字段,用*T,避免因赋值造成锁操作无效 6.其他无法确定的情况都用*T --------------------------------------------- | method receiver | parameter | | ------------------------------------------| | pointer | pointer | |-------------------------------------------| | value | value | | | pointer (dereferenced) | --------------------------------------------- */
有疑问加站长微信联系(非本文作者)