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

时间:2018-11-04 17:18:26

标签: go

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
}

为什么在s.MyValuedoFuncdoMyLogic会得到不同的值?在doMyLogic中为test,在doFunc中为""

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

Jeremy covered why it's not working。我想我可以回答OP想要做什么。我认为对接口的工作方式存在误解。我认为OP正在尝试为myStruct提供myInterface接口,但是接口是隐式的。

type myInterface interface {
    doFunc() bool
}

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

  

我希望myValue对于相同结构中的相同对象来说是相同的 – 15分钟前user1365697

     

想法是创建接口,然后在测试中使用它,并调用创建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的东西。这就是界面背后的想法。无需进行显式声明,任何满足该接口的方法都将起作用。像鸭子打字一样,但严格。

func usesMyInterface(s myInterface) bool {
    return s.doFunc()
}

func main() {
    myS := myStruct{ myValue: "test" }
    usesMyInterface(myS)
}