如何在结构文字中将 bool 指针设置为 true?
How to set bool pointer to true in 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){}
没有
除了 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: 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 或任何语言都有帮助的原因之一是它们帮助我们 "pass by reference"。所以如果我们通过引用传递任何东西,我们就可以 "change" 那个东西。一个带有指向 bool 的指针的函数,即使在函数 returns 之后也可以有效地改变 bool 的值。这是我们不想要的常量,即。他们的价值观不应该改变。因此,这种限制是有道理的。
除了上面icza
提到的技巧,这里还要补充一点。大多数情况下,我们使用指向 bool 的指针而不是直接使用 bool,以便有效地使用指针的 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 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)
}
...
最简单的方法是编写一个简短的函数将 bool
转换为 *bool
。
func BoolPointer(b bool) *bool {
return &b
}
h := handler{is: BoolPointer(true)}
我有下面的函数接受布尔指针。我想知道是否有任何符号允许我在结构文字中将 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){}
没有
除了 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: 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 或任何语言都有帮助的原因之一是它们帮助我们 "pass by reference"。所以如果我们通过引用传递任何东西,我们就可以 "change" 那个东西。一个带有指向 bool 的指针的函数,即使在函数 returns 之后也可以有效地改变 bool 的值。这是我们不想要的常量,即。他们的价值观不应该改变。因此,这种限制是有道理的。
除了上面icza
提到的技巧,这里还要补充一点。大多数情况下,我们使用指向 bool 的指针而不是直接使用 bool,以便有效地使用指针的 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 package
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)
}
...
最简单的方法是编写一个简短的函数将 bool
转换为 *bool
。
func BoolPointer(b bool) *bool {
return &b
}
h := handler{is: BoolPointer(true)}