[Golang]不同的是使用点类型或结构类型调用指针类型的方法?

时间:2014-07-22 17:57:51

标签: pointers go

就像标题所说的那样,在我的情况下调用方法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)
}

1 个答案:

答案 0 :(得分:2)

对于p,调用Greeting()只需致电p.Greeting()u正在呼叫(&u).Greeting()

Example

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}

注意前两个地址具有相同的地址,因为它隐式转换为指针。