登录
首页 >  Golang >  Go问答

为什么我会得到一个带有接口引用的空变量?

来源:stackoverflow

时间:2024-04-18 18:42:41 197浏览 收藏

今天golang学习网给大家带来了《为什么我会得到一个带有接口引用的空变量?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

package main

import (
    "fmt"
    "net/http"
    "sync"
    "time"
)

type myInterface interface {
    doFunc() bool
}

type myStruct struct {
    myValue string
    si            myInterface 
}

func newStrcut(si myInterface ) *myStruct {
    return &myStruct {si: si}
}

var myS *myStruct 

func main() {

    myS = newStrcut(&newStrcut{})
    myS.myValue = "test"
    if myS.doMyLogic() {
        return
    }

}

func (s *myStruct) doMyLogic() bool {
    fmt.Printf(s.myValue )
    s.si.doFunc()
    return false
}

func (s *myStruct) doFunc() bool {
    fmt.Printf(s.myValue)
    return false
}

为什么我在 dofuncdomylogic 中得到不同的 s.myvalue 值?在 domylogic 中,它是 test,在 dofunc 中,它是 ""


解决方案


Jeremy covered why it's not working。我想我可以回答op想要做什么。我认为人们对接口的工作原理存在误解。我认为op正在尝试为mystruct提供myinterface接口,但接口是隐式的。

type myinterface interface {
    dofunc() bool
}

这将创建一个接口 myinterface。事物不需要声明为接口。任何满足接口的东西就是那个接口。任何定义 dofunc() bool 的内容都是 myinterface。无需声明。

我希望同一结构中的相同对象的 myvalue 相同 – user1365697 15 分钟前

想法是创建接口,然后在测试中使用它并调用创建 myvalue 的相同方法,然后发送相关结构 – user1365697 13 分钟前 OP in comment

type mystruct struct {
    myvalue string
    si            myinterface 
}

这定义了一个具有字符串的结构,并且它还具有实现 myinterface 的东西。同样,这就是定义 dofunc() bool 的任何内容。

重要的是要认识到 mystruct.si 与其自己的 myvalue 是完全不同的东西(可能是因为它没有定义)。

我认为op的目的不是为mystruct提供其自己的额外结构,而是为mystruct提供myinterface接口。由于接口是隐式的,mystruct 已经满足 myinterface。它应该看起来像这样:

package main

import (
    "fmt"
)

type myinterface interface {
    dofunc() bool
}

type mystruct struct {
    myvalue string
}

func (s mystruct) domylogic() bool {
    fmt.println(s.myvalue)
    s.dofunc()
    return false
}

func (s mystruct) dofunc() bool {
    fmt.println(s.myvalue)
    return false
}

func main() {
    mys := mystruct{ myvalue: "test" }
    if mys.domylogic() {
        return
    }
}

因为 mystruct 定义了 dofunc() bool,所以它满足 myinterface 接口。无需为其添加额外的字段。

您可以将 mystruct 传递给任何需要 myinterface 的内容。这就是界面背后的想法。任何满足接口的东西都可以工作,而不是进行显式声明。就像 duck typing,但严格。

615536​​466643

您正在访问两个不同对象上的 myvalue 字段。您的代码构造一个对象 mys,其中包含指向第二个对象 mys.si 的指针。

第一个在 myvalue 字段中包含 "test"。另一个,因为从未设置过,所以获取字符串的默认值 ""

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么我会得到一个带有接口引用的空变量?》文章吧,也可关注golang学习网公众号了解相关技术文章。

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