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)
}