登录
首页 >  Golang >  Go问答

关于接口分配的混乱

来源:stackoverflow

时间:2024-04-12 22:18:41 458浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《关于接口分配的混乱》,涉及到,有需要的可以收藏一下

问题内容

我对下面的 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. 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()
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>