【问题标题】:How to combine an interface and struct in golang?如何在golang中结合接口和结构?
【发布时间】:2020-03-31 09:06:12
【问题描述】:
package main


type A interface {
    GetName() string
}

type B struct {
    A
}

func (this *B) Func1() {
    this.GetName()
}

type C struct {
    B
}

func (this *C) GetName() string {
    return "hello"
}


func main() {
    var c = new(C)
    c.GetName()
    c.Func1()
}

https://play.golang.org/p/1X7yiQeie8F

我的问题: c.Func1() 将导致:
恐慌:运行时错误:无效的内存地址或 nil 指针取消引用


我的情况是: 用户需要实现A的一些基本接口,然后用户才能使用B的成员函数。希望复杂的代码封装到B的成员函数中,用户只需要提供基本信息即可。
如何实现这个目标?

【问题讨论】:

  • Haiving 创建了一个C 的实例,你永远不会分配给它嵌入的A,因此它保持在程序创建C 实例时初始化的值—— A 类型的零值。任何接口类型的零值都是nil。尝试调用 nil 接收器上的方法会使您的程序崩溃。
  • 您对问题的描述没有使用常见的 Go 术语,所以我觉得它很混乱。我不能确定你想要什么,但这可能是你想要的:play.golang.org/p/OuHUoEN3k8u
  • 看起来你可能试图在 Go 中重现典型的 OOP 设计,这将导致大量的挫败感和不可读的代码。例如,Go 中的接收者不应命名为 this。我建议放弃任何 OOP 概念,并使用 Go 成语重新思考您的设计。查看Effective Go 以获得良好的起点。
  • @leafbebop 非常感谢。这就是我想要的。
  • @Adrian 谢谢你的建议。我会仔细阅读Effective Go

标签: go inheritance interface encapsulation


【解决方案1】:

我看到你的代码永远循环 GetName 调用重复

你可以看到我的代码

package main

import "fmt"

type A interface {
    GetName() string
}

type B struct {
    A
}

func (this *B) Func1() {

}

type C struct {
    B
}

func (this *C) GetName() string {
    return "hello"
}

func main() {
    var c = new(C)
    fmt.Println(c.GetName())
}

https://play.golang.org/p/PaFd-BS9sdP

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2023-03-04
    • 2016-10-11
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多