go 不支持 `&true` 这样的字面量取址语法,但可通过辅助函数、匿名函数或切片索引等技巧,在结构体字面量中直接将 `*bool` 字段设为指向 `true` 的指针,避免额外声明变量。
在 Go 中,结构体字段若为 *bool 类型(如 is *bool),无法像 &42 或 &"hello" 那样直接使用 &true 初始化——因为 true 是一个未具名的布尔常量,Go 禁止对常量取地址。因此,必须通过某种方式创建一个可寻址的局部 bool 值并获取其地址,同时不引入顶层变量声明。
以下是几种实用且符合 Go 风格的解决方案,按推荐顺序排列:
func newTrue() *bool {
b := true
return &b
}
// 使用示例
h := handler{is: newTrue()}
fmt.Println(*h.is) // 输出: true该函数语义明确、无内存泄漏风险,编译器可高效内联,是生产代码中的首选方案。你还可以扩展为 newFalse() 或泛化为 newBool(b bool)。
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // true
// 或更紧凑的参数化写法
h2 := handler{is: func(v bool) *bool { r
eturn &v }(true)}
fmt.Println(*h2.is) // true这种方式避免了全局函数定义,适合测试或极简上下文;注意每次调用都会创建新栈变量,但开销极小。
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // true虽然能工作,但它会分配一个底层切片数组(即使只含一个元素),且该数组的生命周期与指针绑定——只要 *h.is 存活,整个底层数组就无法被 GC 回收,存在潜在内存浪费。应避免在性能敏感或长期运行的服务中使用。
综上,优先封装 newTrue() 类辅助函数——它兼顾可读性、安全性和可维护性,是 Go 社区广泛采用的惯用模式。