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

Go 为什么我得到一个引用接口的空变量?,go,Go,为什么我在doFunc和doMyLogic中为s.MyValue获取不同的值?在doMyLogic中,它是test,在doFunc中,它是”,您正在访问两个不同对象上的MyValue字段。您的代码构造了一个对象,myS,其中包含指向第二个对象的指针,myS.si 第一个在MyValue字段中包含“test”。另一个,因为从未设置过,所以获取字符串的默认值,“。我想我能回答OP想要做什么。我认为对接口的工作方式存在误解。我认为OP试图给出myStruct接口myInterface接口,但是接口是隐

为什么我在
doFunc
doMyLogic
中为
s.MyValue
获取不同的值?在doMyLogic中,它是
test
,在doFunc中,它是

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

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

。我想我能回答OP想要做什么。我认为对接口的工作方式存在误解。我认为OP试图给出
myStruct
接口
myInterface
接口,但是接口是隐式的

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
}
这将创建一个接口
myInterface
。事物不需要声明为接口的一部分。任何满足接口的东西都是该接口。任何定义
doFunc()bool
的东西都是
myInterface
。没有必要申报


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


我们的想法是创建接口,然后从测试中使用它,并调用创建myValue的相同方法,然后在13分钟前发送相关结构——user1365697

这定义了一个包含字符串的结构,它还包含实现
myInterface
的内容。同样,这是定义
doFunc()bool
的任何内容

认识到
myStruct.si
是一个完全不同的东西(可能是因为它没有定义)它自己的
myValue
,这一点很重要

我认为OP的目的不是给
myStruct
它自己的额外结构,而是给
myStruct
接口。因为接口是隐式的
myStruct
已经满足了
myInterface
。应该是这样的:

type myStruct struct {
    myValue string
    si            myInterface 
}
因为
myStruct
定义了
doFunc()bool
它满足
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
    }
}

删除未使用的库后,我得到了
/test.go:24:21:newStrcut不是类型
。你打算用myS=newStrcut(&newStrcut{})做什么??我需要它来为结构做注入,它是测试所需要的。它不编译,我不知道你打算做什么,所以我不能重现你的问题。如果您提供一个编译和运行的程序,我们可以提供帮助。你的意思是
myS=newStrcut(&myStruct{})
?是的,myS=newStrcut(&myStruct{})的想法是创建接口,然后从测试中使用它,调用创建myValue的相同方法,然后发送相关的结构,我希望值是相同的。为什么对象的属性不同?为什么我得不到相同的值?如何修复它?我希望相同对象中的值相同为什么doMyLogic和doFunc中的“s”不同?我希望相同结构中相同对象的myValue相同Schwern下面的答案涵盖了您可能试图实现的合理版本。
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
    }
}
func usesMyInterface(s myInterface) bool {
    return s.doFunc()
}

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