就像标题所说的那样,在我的情况下调用方法Greeting()
时,我不知道使用结构类型或指针类型时的不同,是调用p.Greeting()
还是{{1}同样的?调用u.Greeting()
方法时,似乎没有任何性能差异。
我认为Greeting()
会自动转换为u.Greeting()
?
Everything in Go is passed by value,但我认为在这种情况下,调用者(&u).Greeting()
通过引用或指针传递。
u
输出:
package main
import "fmt"
type User struct {
Name string
}
func (u *User) Greeting() string {
u.Name = u.Name+" modify"
return fmt.Sprintf("Greetings %s!", u.Name)
}
func main() {
p := &User{"cppgohan by pointer"}
u := User{"cppgohan by value"}
fmt.Println(p.Greeting(), p)
fmt.Println(u.Greeting(), u)
}
答案 0 :(得分:2)
对于p
,调用Greeting()
只需致电p.Greeting()
,u
正在呼叫(&u).Greeting()
。
func (u *User) Greeting() string {
return fmt.Sprintf("Greetings %s [%p]!", u.Name, u)
}
func main() {
p := &User{"cppgohan by pointer"}
u := User{"cppgohan by value"}
pu := &u
fmt.Printf("[%p] %v %v\n", pu, pu.Greeting(), pu)
fmt.Printf("[%p] %v %v\n", &u, u.Greeting(), u)
fmt.Printf("[%p] %v %v\n", p, p.Greeting(), p)
}
输出:
[0x1030e0e0]按值[ 0x1030e0e0 ]问候cppgohan! & {cppgohan by value}
[0x1030e0e0]按值[ 0x1030e0e0 ]问候cppgohan! {cppgohan by value}
[0x1030e0d8]用指针[0x1030e0d8]问候cppgohan! & {cppgohan by pointer}
注意前两个地址具有相同的地址,因为它隐式转换为指针。