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有一个规则,如果你试图调用一个类型与接收者类型“非常相似”的变量的方法(只是间接不同),那么语言会隐式地接受指针/解引用。