空结构体用于reflect.TypeOf。

huangapple go评论75阅读模式
英文:

Empty struct to use with reflect.TypeOf

问题

&Duck{}(*Duck)(nil) 之间有什么区别?有没有理由更喜欢其中之一?

这两者之间的区别在于它们的类型和用途不同。

&Duck{} 是一个指向 Duck 类型的指针,它指向一个新创建的 Duck 对象。这种方式可以用于创建一个新的 Duck 对象,并获取指向该对象的指针。

(*Duck)(nil) 是一个空指针,它的类型是 *Duck。这种方式可以用于表示一个空的 Duck 指针。

在使用上的区别是:

  • &Duck{} 创建了一个新的 Duck 对象,并返回指向该对象的指针。
  • (*Duck)(nil) 表示一个空的 Duck 指针。

在上面的示例中,reflect.TypeOf(&Duck{}) == reflect.TypeOf((*Duck)(nil)) 返回 true,说明它们的类型是相同的。

nil == (*Duck)(nil)nil == &Duck{} 分别返回 truefalse,说明它们与 nil 的比较结果是不同的。

选择使用哪种方式取决于具体的需求和上下文。如果需要创建一个新的对象并获取指向该对象的指针,可以使用 &Duck{}。如果只需要表示一个空的指针,可以使用 (*Duck)(nil)

英文:

Whats the difference between &Duck{} and (*Duck)(nil)?
Is there any reason to prefer one over the other?

ex:

    fmt.Println(reflect.TypeOf(&Duck{}) == reflect.TypeOf((*Duck)(nil)))//true
    fmt.Println(nil == (*Duck)(nil))//true
	fmt.Println(nil == &Duck{})//false

答案1

得分: 2

&Duck{}指向一个"Zero"结构体实例,但它肯定不是nil!你可以给它赋值。而对于nil指针,无论它们具有相同的类型,你都不能这样做。

如果你只是对检查类型感兴趣,我想nil指针更高效,因为不涉及对象的分配。

所以关键是你想要做什么。

英文:

&Duck{} points to a "Zero" struct instance, but it is most certainly not nil! You can assign values to it. You can't do all that to a nil pointer, regardless of the fact that they have the same type.

If you're just interested in checking types, I suppose a nil pointer is more efficient as there are no allocations of objects involved.

So it comes down to what exactly it is you want to do.

huangapple
  • 本文由 发表于 2015年2月13日 02:27:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/28485007.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定