当 `User` 是 struct 时,`(*User)(nil)` 是什么?

aka*_*kai -2 pointers type-conversion go

这编译:

package main

import (
    "fmt"
)

type User struct {
    ID int64
}

func main() {
    v := (*User)(nil)
    fmt.Println(v)
}
Run Code Online (Sandbox Code Playgroud)

在这里,什么是(*User)(nil)?我在go-pg遇到了这个符号,并且没有线索找到答案,因为在谷歌上搜索非常困难。

icz*_*cza 5

如果User是一种类型*User则 是另一种类型,一个指针类型,一个指向 的指针User

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

因此v将是一个 类型的变量*User,保存nil指针值。

v := (*User)(nil)表达式是一个简短的变量声明,它相当于(简写)以下变量声明

var v *User = nil
Run Code Online (Sandbox Code Playgroud)

这当然是一样的

var v *User
Run Code Online (Sandbox Code Playgroud)

因为如果缺少初始化表达式,变量将被初始化为零,这适用nil于所有指针类型。