This compiles:
package main
import (
"fmt"
)
type User struct {
ID int64
}
func main() {
v := (*User)(nil)
fmt.Println(v)
}
Here, what is (*User)(nil)?
I encountered this notation at go-pg, and had no clue to find an answer because it was very hard to search on google.
CodePudding user response:
If User is a type, *User is another type, a pointer type, a pointer to User.
(*User)(nil) is a type conversion: it converts the untyped nil predeclared identifier to (*user). You must put *User into parenthesis, else the expression would try to convert nil to User (which is a compile-time error if User is a struct), and then dereference it.
So v will be a variable of type *User, holding the nil pointer value.
The v := (*User)(nil) expression is a short variable declaration and it is equivalent (shorthand) to the following variable declaration:
var v *User = nil
Which is of course the same as
var v *User
Because if the initialization expression is missing, the variable will be initialized to its zero value which is nil for all pointer types.
