Pointers [Golang]关于使用指针类型、使用点类型或结构类型调用方法的不同之处?
正如标题所说,我不知道调用方法Pointers [Golang]关于使用指针类型、使用点类型或结构类型调用方法的不同之处?,pointers,go,Pointers,Go,正如标题所说,我不知道调用方法Greeting()时使用结构类型或指针类型有什么不同。在我的例子中,调用p.Greeting()和u.Greeting()是否完全相同?调用Greeting()方法时,性能似乎也没有什么不同 我认为u.Greeting()会自动转换为(&u).Greeting() ,但我认为在这种情况下,调用方u是通过引用或指针传递的 package main import "fmt" type User struct { Name string } func (u
Greeting()
时使用结构类型或指针类型有什么不同。在我的例子中,调用p.Greeting()
和u.Greeting()
是否完全相同?调用Greeting()
方法时,性能似乎也没有什么不同
我认为u.Greeting()
会自动转换为(&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)
}
输出:
Greetings cppgohan by pointer modify! &{cppgohan by pointer modify}
Greetings cppgohan by value modify! {cppgohan by value modify}
对于
p
,调用Greeting()
只是调用p.Greeting()
,对于u
它调用的是(&u).Greeting()
:
输出:
Greetings cppgohan by pointer modify! &{cppgohan by pointer modify}
Greetings cppgohan by value modify! {cppgohan by value modify}
[0x1030e0e0]通过值[0x1030e0e0]向cppgohan致意&{cppgohan按值计算}
[0x1030e0e0]通过值[0x1030e0e0]向cppgohan致意!{cppgohan按值计算}
[0x1030e0d8]通过指针[0x1030e0d8]向cppgohan致意&{cppgohan by pointer}
请注意前两个地址是如何相同的,因为它隐式转换为指针。感谢您让我理解!下一次我会自己去想。Go有一个规则,如果你试图调用一个类型与接收者类型“非常相似”的变量的方法(只是间接不同),那么语言会隐式地接受指针/解引用。