We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于这部分内容,在写代码时一直都是用指针类型的 receiver,但没有系统整理过规则,这里进行总结。
首先是官方 FAQ 中说的那三条:
struct
还有一些其它的规则:
method express
map
func
chan
slice
sync.Mutex
array
int
string
下面看两个比较容易搞混的例子:
package main import ( "fmt" ) type Ball struct { Name string } func (b *Ball) Ping() { fmt.Println("ping") } func (b Ball) Pong() { fmt.Println("pong") } func main() { v := Ball{} p := &Ball{} v.Ping() v.Pong() p.Ping() p.Pong() }
运行结果是都可以正常执行:
❯ go run test.go ping pong ping pong
也就是说,struct 的实例和实例指针都可以调用值类型和指针类型 receiver 的方法。
再看这段代码,这里是通过 method expression 的方式调用方法:
method expression
package main import ( "fmt" ) type Ball struct { Name string } func (b *Ball) Ping() { fmt.Println("ping") } func (b Ball) Pong() { fmt.Println("pong") } func main() { v := Ball{} Ball.Ping(&v) Ball.Pong(v) }
这次的执行结果呢?
❯ go run test.go # command-line-arguments ./t.go:23:6: invalid method expression Ball.Ping (needs pointer receiver: (*Ball).Ping) ./t.go:23:6: Ball.Ping undefined (type Ball has no method Ping)
可以看到,通过 method expression 的方式,struct 值只能调用值类型 receiver 的方法。
再看 struct 指针调用方法:
func main() { p := &Ball{} (*Ball).Ping(p) (*Ball).Pong(p) }
执行结果:
❯ go run test.go ping pong
即 struct 指针是能调用值类型和指针类型 receiver 的方法的。
但在写代码时,不建议使用 method expression 这种方式来调用方法。不过应该也没有人会用这种方式的...吧?
The text was updated successfully, but these errors were encountered:
No branches or pull requests
关于这部分内容,在写代码时一直都是用指针类型的 receiver,但没有系统整理过规则,这里进行总结。
首先是官方 FAQ 中说的那三条:
struct
,使用指针将非常合适。还有一些其它的规则:
method express
方式,struct 值只能调用值类型 receiver 的方法,而 struct 指针是能调用值类型和指针类型 receiver 的方法的。map
、func
或chan
,不要使用指针。slice
,并且方法不会重新分配slice
,不要使用指针。sync.Mutex
或其它类似的同步字段的结构体,receiver 必须是指针,以避免复制。struct
或array
,receiver 用指针效率会更高。那么,多大是大?假设要把它的所有元素作为参数传递给方法,如果这样会感觉太大,那对 receiver 来说也就太大了。struct
、array
或slice
,并且它的任何元素都是可能发生改变的内容的指针,最好使用指针类型的 receiver,这会使代码可读性更高。array
或struct
,没有可变字段,没有指针,或只是一个简单的基础类型,如int
或string
,使用值类型的 receiver 更合适。下面看两个比较容易搞混的例子:
运行结果是都可以正常执行:
也就是说,struct 的实例和实例指针都可以调用值类型和指针类型 receiver 的方法。
再看这段代码,这里是通过
method expression
的方式调用方法:这次的执行结果呢?
可以看到,通过
method expression
的方式,struct 值只能调用值类型 receiver 的方法。再看 struct 指针调用方法:
执行结果:
即 struct 指针是能调用值类型和指针类型 receiver 的方法的。
但在写代码时,不建议使用
method expression
这种方式来调用方法。不过应该也没有人会用这种方式的...吧?The text was updated successfully, but these errors were encountered: