首页 > 解决方案 > 关于接口分配的困惑

问题描述

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

  1. worker=u并且work=&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

}

标签: go

解决方案


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

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

  3. worker=&pPeople作为implementsWork方法是有效的。

  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()
}

推荐阅读