我遇到了使用
any
类型的工作。一切都运行得很好,直到我尝试/不得不使用指向 any
(*any
) 的指针。这是一个示例playground链接,代码也在这篇文章的底部。
如果我有一个已定义类型的结构,一切都很好。如果我将其更改为any(而不是指向它的指针),调用新方法也很简单。当然,检索实际值需要进行一些转换。 但是一旦我使用指向
any
的指针,我就必须将变量复制到 var xyz any
,并且为了返回,我还需要一些辅助变量。
是否有更好的方法来使用
dataThree
结构和相应的 func newThree(v *any) dataThree {...
函数,但仍保留它 *any
?某种反思会有帮助吗?
package main
import "fmt"
type Value struct {
value int
}
/**
* type as pointer
*/
type dataOne struct {
data *Value
}
func newOne(v *Value) dataOne {
return dataOne{
data: v,
}
}
/**
* Any as value
*/
type dataTwo struct {
data any
}
func newTwo(v Value) dataTwo {
return dataTwo{
data: v,
}
}
/**
* Any as pointer
*/
type dataThree struct {
data *any
}
func newThree(v *any) dataThree {
return dataThree{
data: v,
}
}
func main() {
one := Value{value: 1}
myOne := newOne(&one)
fmt.Println(myOne.data.value)
two := Value{value: 2}
myTwo := newTwo(two)
fmt.Println(myTwo.data.(Value).value)
three := Value{value: 3}
var aT any
aT = three
myThree := newThree(&aT)
myData := *myThree.data
castAt := myData.(Value)
fmt.Println(castAt.value)
}
在golang中,
any
是interface{}
,相当于python和C#中的object
,java中的Object
,typescript中的any
,你可以在里面存储任何东西。
而且
any
已经是一个引用类型。当您在 any 中存储值时,如果该值是非原始值(如结构体、切片等),它会在内部存储指向实际数据的指针。因此,拥有指向 any 的指针会增加不必要的间接级别。
基本上你永远不需要指向
any
的指针。相反,您可以在其中存储引用。