Pointers 如何在struct literal中将bool指针设置为true?

Pointers 如何在struct literal中将bool指针设置为true?,pointers,go,struct,literals,Pointers,Go,Struct,Literals,我有下面的函数,它接受bool指针。我想知道是否有任何符号允许我在struct literal中将is字段的值设置为true;基本上不需要定义新的标识符(即var x:=true;handler{is:&x}) 没有 除了由new返回的零值之外,没有语法定义指向基元类型的指针。数字类型和字符串也是如此 您需要先创建一个值来获取的地址,或者创建一个带有零值的指针,然后在事实发生后分配一个新值。您可以这样做,但这不是最优的: h := handler{is: &[]bool{true}[0]

我有下面的函数,它接受bool指针。我想知道是否有任何符号允许我在struct literal中将
is
字段的值设置为
true
;基本上不需要定义新的标识符
(即var x:=true;handler{is:&x})

没有

除了由
new
返回的零值之外,没有语法定义指向基元类型的指针。数字类型和字符串也是如此


您需要先创建一个值来获取的地址,或者创建一个带有零值的指针,然后在事实发生后分配一个新值。

您可以这样做,但这不是最优的:

h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
基本上,它创建了一个片,片中有一个
bool
true
,对其第一个元素进行索引并获取其地址。没有创建新的变量,但是有很多样板文件(在第一个元素的地址存在之前,支持数组将保留在内存中)

更好的解决方案是编写助手函数:

func newTrue() *bool {
    b := true
    return &b
}
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true
使用它:

h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true
您还可以使用一行匿名函数执行此操作:

func newTrue() *bool {
    b := true
    return &b
}
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或任何语言中都很有用的原因之一是,它们帮助我们“通过引用传递”。所以,如果我们通过引用传递任何东西,我们就可以“改变”那个东西。使用指向bool的指针的函数,即使在函数返回后,也可以有效地更改bool的值。这正是我们不希望常数出现的情况,即它们的值不应该改变。因此,这种限制是有道理的

除了上面提到的
icza
技巧之外,我想在这里添加一点。大多数情况下,为了有效地使用指针的nil值,我们使用指向bools的指针,而不是直接指向bools的指针,否则指针的nil值必须为true或false。如果是这种情况,那么您可能希望在函数中直接使用可选的bool标志,而不是像示例中所示的那样使用指向bool的指针,甚至是一个封装单个bool指针的结构,这样就不需要结构偶。。现在,当然,如果由于任何其他原因需要该结构,您可以很好地使用上面的
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

我使用了一个类似于@icza的函数,但更方便(对我来说)

我在我的
utils包中创建了一个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)
}
...

我想我必须使用难看的bools b/c,语法是作为生成器的命令参数提供的,所以我买不起helper函数。@用户没有我不明白为什么您的案例不允许函数。想分享更多细节吗?语法(类型字段)应该提供给命令行/生成器。提供函数作为cli参数并不好。仅仅创建一个伪变量不是更好吗?性能影响?@MrR是的,那更好。可能一行帮助程序也会内联。相关:您可以使用包,例如:
var\u*bool=pointer.bool(true)
注意:如果您处理的是AWS Go SDK,则有一个专门用于此的
AWS.bool()
函数。