【发布时间】:2023-03-04 09:49:01
【问题描述】:
简而言之,对于任何人来说,对于一个好的架构我们应该使用接口,这不是什么秘密,那些描述了它的行为。 Golang 实现了这个想法,但是他们的接口只有方法,没有字段。因此,使用它们的唯一方法就是创建 getter 和 setter。但是这样我就遇到了指针问题。
例如:
package main
import "fmt"
// A
type IA interface {
Foo() string
}
type A struct {
foo string
}
func (a *A) Foo() string {
return a.foo
}
// B
type IB interface {
A() *IA
}
type B struct {
a *IA
}
func (b *B) A() *IA {
return b.a
}
// main
func main() {
a := &A{"lol"}
b := &B{a} // cannot use a (type *A) as type *IA in field value: *IA is pointer to interface, not interface
foo := b.A().Foo() // b.A().Foo undefined (type *IA is pointer to interface, not interface)
fmt.Println(foo)
}
Ofc,我可以使用这样的东西:
(*(*b).A()).Foo()
但这会那么好和合适吗?
我只想在 python、js、ts 中有类似的行为:
someObj.child1.child2.child2SomeMethod()
也许我搞砸了指针,我只是想知道 golang 处理嵌套对象的方式。
【问题讨论】:
-
*IA是你的问题。不要使用指向接口的指针,除非它正是您所需要的,几乎从来都不是这样。解决方案?请改用IA。 play.golang.org/p/j_JXS3uDX4U -
@mkopriva,我认为我们应该使用指针,只要有可能不会错误地对其值应用任何更改
-
我不确定你从哪里得到的启发式方法,但它是错误的,不管我们是否在谈论接口。
-
@dominux 实际上相反是正确的:按值传递不允许更改值(假设结构中没有任何嵌套指针)。请参阅stackoverflow.com/questions/23542989/… 了解更多信息。
标签: go architecture nested