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

问题描述 投票:19回答:3

我有下面的函数接受一个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){}
pointers go struct literals
3个回答
22
投票

你可以这样做,但它不是最佳的:

h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true

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

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

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)}

要查看所有选项,请查看我的其他答案:How do I do a literal *int64 in Go?


4
投票

没有。

没有语法来定义指向基本类型的指针,而不是new返回的零值。数字类型和字符串也是如此。

您需要事先创建一个值来获取地址,或者创建一个零值的指针,并在事后指定一个新值。


-1
投票

指针对于这个问题有用或者任何语言的原因之一是它们帮助我们“通过引用传递”。因此,如果我们通过引用传递任何东西,我们就可以“改变”那件事。将指针指向bool的函数即使在函数返回后也可以有效地改变bool的值。这是我们不想要的常量,即。他们的价值观不应该改变。因此这种限制是有道理的。

除了icza上面提到的技巧之外,还想在这里添加一点。大多数情况下,为了有效地使用指针的nil值,我们使用指针来bool而不是bool,否则必须是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
© www.soinside.com 2019 - 2024. All rights reserved.