【问题标题】:What does a pair of round brackets syntax expression mean in Go? [duplicate]Go中一对圆括号语法表达式是什么意思? [复制]
【发布时间】:2020-02-27 23:25:25
【问题描述】:

读到这个https://github.com/go-pg/pg/wiki/Writing-Queries#select我多次看到这个表达:

(*Book)(nil)

例子:

count, err := db.Model((*Book)(nil)).Count()

这是什么意思?

【问题讨论】:

标签: go syntax expression rules


【解决方案1】:

这是一种类型转换。假设db.Model 函数接受interface{},它会向函数发送一个*Book 类型的nil 接口。

要将值v 转换为类型Book,您可以这样写:

Book(v)

但是,您不能编写 Book(nil),因为 nil 是指针,而 Book 不是。如果你有类型

type BookPtr *Book

那么你可以写成BookPtr(nil)。扩展它,你想写*Book(nil),但这意味着*(Book(nil))是无效的,因此:

(*Book)(nil)

【讨论】:

  • 所以只有在这种情况下才需要这个?要将 nil 转换为 *Type 接口?
  • 如果你在谈论类型转换,如果值不是 nil 也需要它,比如 (*SomePtr)(someValue)。例如,您可以使用它来将结构值复制到另一个具有不同但兼容类型的结构值。
【解决方案2】:

'nil' 对于 Go 就像 NULL/null 对于 C#/Java 等其他语言一样。*Variable 只是获取 Model 的 Book 对象的指针值。

所以在这种情况下,我相信这里发生的事情是 (*Book)(nil) 将 Model 的 Book 对象的指针值设置为 nil(/null)。

希望这在某种程度上有所帮助。 ?

好资源:https://go101.org/article/nil.html

【讨论】:

  • 所以只有在这种情况下才需要这个?要将 nil 转换为 *Type 接口?
  • 我敢肯定还有其他时候你可能想这样做,但通常我会说是的。
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2011-05-22
  • 2013-10-13
  • 2013-10-06
相关资源
最近更新 更多