关于接口分配的困惑

时间:2019-07-24 09:03:04

标签: go

我对以下Go代码感到非常困惑。谁能告诉我为什么

  1. worker=uwork=&u有效吗?
  2. worker=p有效吗?
  3. worker=&p无效?
  4. 用户与人之间有什么区别?
package main

import (
    "fmt"
)

type Worker interface {
    Work()
}

type User struct {
    name string
}

func (u User) Work() {

}

type People struct {
    name string
}

func (p *People) Work() {

}

func main() {
    var worker Worker

    u := User{name:"xxx"}
    worker = u  // valid
    worker = &u  // valid

    p := People{name:"xxx"}
    worker = p  // invalid
    worker = &p  // valid

}

1 个答案:

答案 0 :(得分:1)

  1. worker=uwork=&u是有效的,因为User实现Worker的所有方法,在这种情况下,只有Work方法具有接收者的值。值方法可以在值和指针上调用。

  2. worker=p无效,因为People实现了带有接收者指针的Work方法。因此,如果您将People的任何值分配给Worker指针,则将不会使用Work方法。这就是为什么它无效的原因。

  3. worker=&p有效,因为People实现了Work方法。

  4. User和People是实现相同接口Worker的两个不同结构。这样可以确保两者都有一个名为Work的方法,但是实现可能有所不同。

package main

import (
    "fmt"
)

type Worker interface {
    Work()
}

type User struct {
    name string
}

func (u User) Work() {
    fmt.Printf("Name : %s\n", u.name)
}

type People struct {
    name string
}

func (p *People) Work() {
    fmt.Printf("Name : %s\n", p.name)
}

func main() {
    var worker Worker

    u := User{name: "uuu"}
    worker = u  // valid
    worker = &u // valid
    worker.Work()

    p := People{name: "pppp"}
    // worker = p  // invalid
    worker = &p // valid
    worker.Work()
}