1. 程式人生 > >go 方法接受者 是指標型別和非指標型別的 區別

go 方法接受者 是指標型別和非指標型別的 區別

go 方法接受者 是指標型別和非指標型別的 區別

非指標型別

package main

import "fmt"

// 定義介面
type Car interface {
    GetName() string
    Run()
}

// 定義結構體
type Tesla struct {
    Name string
}

// 實現介面的GetName()方法
func (t Tesla) GetName() string {
    t.Name = "test"
    return t.Name
}

// 實現介面的Run()方法
func (t Tesla) Run() {
    fmt.Printf("%s is running\n", t.Name)
}

func main() {
    var c Car
    var t Tesla = Tesla{"Tesla Model S"}
    c = t  // 上面是用指標*Tesla實現了介面的方法,這裡要傳地址
    fmt.Println(c.GetName())
    c.Run()
}
test
Tesla Model S is running

指標型別

package main

import "fmt"

// 定義介面
type Car interface {
    GetName() string
    Run()
}

// 定義結構體
type Tesla struct {
    Name string
}

// 實現介面的GetName()方法
func (t *Tesla) GetName() string {
    t.Name = "test"
    return t.Name
}

// 實現介面的Run()方法
func (t *Tesla) Run() {
    fmt.Printf("%s is running\n", t.Name)
}

func main() {
    var c Car
    var t Tesla = Tesla{"Tesla Model S"}
    c = &t  // 上面是用指標*Tesla實現了介面的方法,這裡要傳地址
    fmt.Println(c.GetName())
    c.Run()
}
test
test is running

結論

傳遞指標 可以 修改 傳遞的結構體的值,在其他方法中也生效。
原來一直寫python,不瞭解指標有啥用。 用到這裡明白了一點點。