先说结论:
1、编译器未不允许为类型定义方法名相同的对象和指针方式的方法。(比如同一个test方法不能同时存在指针形式和对象形式)
2、对象调用指针形式的方法:是把对象求地址然后传入函数第一个参数。
3、指针调用对象形式的方法:是把指针指向的对象传入函数第一个参数。
type ff struct {
M sync.Mutex
}
func (this *ff) tt() {
this.M.Lock()
}
ff2:=ff{M:sync.Mutex{}}
ff2.tt()
ff2.M.Lock() //panic
ff1:=&ff{M:sync.Mutex{}}
ff1.tt()
ff1.M.Lock() //panic
如上所知,同一个goroutine中向同一把锁执行加锁操作,将会引发panic。这里是操作的同一把锁。
type ff struct {
M sync.Mutex
}
func (this ff) tt() {
this.M.Lock()
}
ff2:=ff{M:sync.Mutex{}}
ff2.tt()
ff2.M.Lock() //正常
ff1:=&ff{M:sync.Mutex{}}
ff1.tt()
ff1.M.Lock() //正常
这里将不会panic,因为并不是网上说的指针形式的方法不存在会生成指针形式的方法,而是把指针的值作为参数传入函数。