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.MyValue
和doFunc
中doMyLogic
会得到不同的值?在doMyLogic中为test
,在doFunc中为""
。
答案 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)
}