【问题标题】:When `User` is struct, what is `(*User)(nil)`?当 `User` 是 struct 时,`(*User)(nil)` 是什么?
【发布时间】:2021-11-26 21:50:33
【问题描述】:

这样编译:

package main

import (
    "fmt"
)

type User struct {
    ID int64
}

func main() {
    v := (*User)(nil)
    fmt.Println(v)
}

这里,(*User)(nil) 是什么? 我在go-pg 遇到了这个符号,但不知道如何找到答案,因为在 google 上很难搜索。

【问题讨论】:

  • 相当于var v *User,不知道他们为什么使用这个特定的符号,因为nil总是指针的零值。
  • 这是一种用于传达类型的常用技术 - 通常用于反射目的 - 而不会产生创建该类型变量的开销。
  • 这不是和var v *User 具有完全相同的性能影响吗?
  • 啊,避免 go-pg 的另一个原因 :0) 改用 GORM。
  • @DanielFarrell 它节省了一行代码:)

标签: go pointers type-conversion


【解决方案1】:

如果Usertype*User 是另一种类型,pointer type,指向User 的指针。

(*User)(nil)conversion 类型:它将无类型的nil 预声明标识符转换为(*User)。您必须将*User 放入括号中,否则表达式会尝试将nil 转换为User(如果User 是结构,则这是编译时错误),然后取消引用它。

所以v 将是一个*User 类型的变量,持有nil 指针值。

v := (*User)(nil) 表达式是一个short variable declaration,它等同于(简写)以下variable declaration

var v *User = nil

当然是一样的

var v *User

因为如果缺少初始化表达式,该变量将被初始化为它的zero value,对于所有指针类型都是nil

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 2018-02-12
    • 2013-02-08
    • 2016-07-17
    • 2017-08-16
    • 2022-01-20
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多