我有下面的函数,它接受一个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){}
字符串
6条答案
按热度按时间von4xj4u1#
你可以这样做,但这不是最佳的:
字符串
基本上,它创建一个值为
true
的bool
切片,索引其第一个元素并获取其地址。没有创建新变量,但有很多样板(并且备份数组将保留在内存中,直到其第一个元素的地址存在)。一个更好的解决方案是写一个helper函数:
型
并使用它:
型
你也可以使用一行匿名函数:
型
或者一个变体:
型
要查看所有选项,请查看我的另一个答案:如何在Go中执行文字 *int64?
7vux5j2d2#
最简单的方法是编写一个简短的函数,将
bool
转换为*bool
。字符串
pgpifvop3#
号
除了
new
返回的零值之外,没有语法来定义指向原始类型的指针。数值类型和字符串也是如此。你要么需要事先创建一个值来获取地址,要么用零值创建指针,并在事后分配一个新值。
6jjcrrmo4#
我使用了一个类似于@icza的函数,但(对我来说)更方便
我在
utils package
中创建了一个BoolAddr函数字符串
对我来说,它更容易使用
型
iyfamqjs5#
如果你使用的是Go 1.18或更高版本,你可以利用新引入的泛型特性来创建一个实用函数,它可以生成指向任何给定类型的指针。
字符串
用途:
型
sc4hvdpw6#
指针在go或任何语言中很有用的原因之一,是它们帮助我们“通过引用传递”。所以如果我们通过引用传递任何东西,我们就可以“改变”那个东西。一个函数接受一个指向bool的指针,即使在函数返回后,也可以有效地改变bool的值。这正是我们不想要的常量,也就是说,它们的值不应该改变。因此,这种限制是有意义的。
除了上面提到的
icza
的技巧之外,我们还想在这里添加一个点。大多数情况下,我们使用指向bool的指针而不是直接使用bool,以便有效地使用指针的nil值,否则必须为true或false。如果是这种情况,那么你可能想直接在函数中使用可选的bool标志,而不是有指向bool的指针,或者甚至是一个结构体,如你的例子中所示, Package 单个bool指针,甚至放弃了结构体的完整要求。现在,当然,如果结构体是出于任何其他原因被请求的,你可以很好地使用上面icza
的任何技巧。顺便说一句,你可以直接拥有一个bool值的副本,用于使用下面的地址。字符串