下面的函数接受布尔指针。我想知道是否有任何符号可以让我在struct literal中将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){}
你可以这样做,但不是最优的:
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
基本上,它创建一个具有值为true
的bool
的切片,对其第一个元素进行索引并获取其地址。没有创建新的变量,但有很多样板文件(支持数组将保留在内存中,直到第一个元素的地址存在为止)。
一个更好的解决方案是编写一个辅助函数:
func newTrue() *bool {
b := true
return &b
}
使用它:
h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true
您也可以使用一个单行匿名函数:
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true
或者一种变体:
h := handler{is: func(b bool) *bool { return &b }(true)}
要查看您的所有选项,请查看我的另一个答案:如何在Go中执行字面*int64?
最简单的方法是编写一个短函数,将bool
转换为*bool
。
func BoolPointer(b bool) *bool {
return &b
}
h := handler{is: BoolPointer(true)}
否。
除了new
返回的零值之外,没有语法可以定义指向基元类型的指针。数字类型和字符串也是如此。
您要么需要在指针之前创建一个值来获取的地址,要么创建具有零值的指针,然后在事实之后分配一个新值。
我使用了一个类似于@icza的函数,但在某种程度上(对我来说)更方便
我在utils package
中创建了一个BoolAddr函数
package utils
func BoolAddr(b bool) *bool {
boolVar := b
return &boolVar
}
对我来说,使用更容易
package main
import "example.com/example/utils"
...
type Example struct {
isActive *bool
}
ex := Expample {
isActive: utils.BoolAddr(true)
}
...
指针在go或任何语言中都很有用的原因之一是它们帮助我们"通过引用传递"。所以,如果我们通过引用传递任何东西,我们就可以"改变"它。一个将指针指向bool的函数,即使在函数返回后,也可以有效地更改bool的值。这正是我们不希望常量发生的事情,即它们的值不应该改变。因此,这种限制是有道理的。
除了icza
上面提到的技巧之外,我想在这里补充一点。大多数情况下,我们使用指向布尔的指针,而不是直接使用布尔,以便有效地使用指针的nil值,否则必须为true或false。如果是这种情况,那么您可能希望直接在函数中使用可选的bool标志,而不是像您的示例中所示那样使用指向bool的指针,甚至是一个结构来包装单个bool指针,从而取消结构的完整要求。。现在,当然,如果结构由于任何其他原因而被reqd,那么您可以很好地使用上面icza
的任何技巧。顺便说一句,你也可以直接拥有一个bool值的副本,用于使用的地址如下。
const check = true
chk := check
fmt.Println(&chk) // will give you the address of chk
chk = false
fmt.Println(chk) // will print false
fmt.Println(check) // will print true