Go语言 如何在struct literal中设置bool指针为true?

j7dteeu8  于 5个月前  发布在  Go
关注(0)|答案(6)|浏览(52)

我有下面的函数,它接受一个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){}

字符串

von4xj4u

von4xj4u1#

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

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

字符串
基本上,它创建一个值为truebool切片,索引其第一个元素并获取其地址。没有创建新变量,但有很多样板(并且备份数组将保留在内存中,直到其第一个元素的地址存在)。
一个更好的解决方案是写一个helper函数:

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?

7vux5j2d

7vux5j2d2#

最简单的方法是编写一个简短的函数,将bool转换为*bool

func BoolPointer(b bool) *bool {
    return &b
}

h := handler{is: BoolPointer(true)}

字符串

pgpifvop

pgpifvop3#


除了new返回的零值之外,没有语法来定义指向原始类型的指针。数值类型和字符串也是如此。
你要么需要事先创建一个值来获取地址,要么用零值创建指针,并在事后分配一个新值。

6jjcrrmo

6jjcrrmo4#

我使用了一个类似于@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)
}
...

iyfamqjs

iyfamqjs5#

如果你使用的是Go 1.18或更高版本,你可以利用新引入的泛型特性来创建一个实用函数,它可以生成指向任何给定类型的指针。

func Pointer[T any](d T) *T {
    return &d
}

字符串
用途:

type Example struct {
    isActive *bool
}

ex := Example {
    isActive: Pointer(true),
}

sc4hvdpw

sc4hvdpw6#

指针在go或任何语言中很有用的原因之一,是它们帮助我们“通过引用传递”。所以如果我们通过引用传递任何东西,我们就可以“改变”那个东西。一个函数接受一个指向bool的指针,即使在函数返回后,也可以有效地改变bool的值。这正是我们不想要的常量,也就是说,它们的值不应该改变。因此,这种限制是有意义的。
除了上面提到的icza的技巧之外,我们还想在这里添加一个点。大多数情况下,我们使用指向bool的指针而不是直接使用bool,以便有效地使用指针的nil值,否则必须为true或false。如果是这种情况,那么你可能想直接在函数中使用可选的bool标志,而不是有指向bool的指针,或者甚至是一个结构体,如你的例子中所示, Package 单个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

字符串

相关问题