分享
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
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) | --------------------------------------------- */
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1656 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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) | --------------------------------------------- */