The*_*hat 22 struct pointers literals go
我有下面的函数接受一个bool指针.我想知道是否有任何符号允许我在结构文字中设置is字段的值true; 基本上没有定义新的标识符(i.e. var x := true ; handler{is: &x} )
package main
import "fmt"
func main() {
fmt.Println("Hello, playground")
check(handler{is: new(bool) })
}
type handler struct{
is *bool
}
func check(is handler){}
Run Code Online (Sandbox Code Playgroud)
icz*_*cza 26
你可以这样做,但它不是最佳的:
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
Run Code Online (Sandbox Code Playgroud)
基本上它创建一个带有一个bool值的切片true,索引其第一个元素并获取其地址.没有创建新的变量,但是有很多样板(并且支持数组将保留在内存中,直到其第一个元素的地址存在).
更好的解决方案是编写辅助函数:
func newTrue() *bool {
b := true
return &b
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true
Run Code Online (Sandbox Code Playgroud)
您也可以使用单行匿名函数:
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true
Run Code Online (Sandbox Code Playgroud)
或变种:
h := handler{is: func(b bool) *bool { return &b }(true)}
Run Code Online (Sandbox Code Playgroud)
要查看所有选项,请查看我的其他答案:如何在Go中执行文字*int64?
小智 7
最简单的方法是编写一个短函数将 a 转换bool为 a *bool。
func BoolPointer(b bool) *bool {
return &b
}
h := handler{is: BoolPointer(true)}
Run Code Online (Sandbox Code Playgroud)
不。
除了 所返回的零值之外,没有任何语法可以定义指向基本类型的指针new。数字类型和字符串也是如此。
您要么需要事先创建一个值来获取地址,要么创建一个零值的指针,并在事后分配一个新值。