如何在结构文本中将布尔指针设置为true



下面的函数接受布尔指针。我想知道是否有任何符号可以让我在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

基本上,它创建一个具有值为truebool的切片,对其第一个元素进行索引并获取其地址。没有创建新的变量,但有很多样板文件(支持数组将保留在内存中,直到第一个元素的地址存在为止)。

一个更好的解决方案是编写一个辅助函数:

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

最新更新