【问题标题】:How to set bool pointer to true in struct literal?如何在结构文字中将 bool 指针设置为 true?
【发布时间】:2015-05-03 06:56:07
【问题描述】:

我有下面的函数,它接受一个布尔指针。我想知道是否有任何符号允许我在结构文字中将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


【解决方案1】:

您可以这样做,但这不是最佳选择:

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?

【讨论】:

  • 我想我必须使用丑陋的 bools b/c 语法作为命令参数提供给生成器,所以我买不起辅助函数。
  • @Theuserwithnohat 我不明白为什么您的案例不允许使用功能。愿意分享更多细节吗?
  • 语法(类型字段)应该提供给命令行/生成器。提供一个函数作为 cli 参数并不好。
  • 创建一个伪变量不是更好吗?性能影响?
  • @MrR 是的,这样更好。单行助手可能也被内联了。
【解决方案2】:

没有。

除了new 返回的零值之外,没有定义指向原始类型的指针的语法。数字类型和字符串也是如此。

您要么需要事先创建一个值来获取地址,要么创建一个零值的指针,然后再分配一个新值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      func BoolPointer(b bool) *bool {
          return &b
      }
      
      h := handler{is: BoolPointer(true)}
      

      【讨论】:

        【解决方案5】:

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

        除了上面icza 提到的技巧,想在这里补充一点。大多数情况下,我们使用指向布尔值的指针而不是直接使用布尔值,以便有效地使用指针的 nil 值,否则指针必须为真或假。如果是这种情况,那么您可能希望直接在函数中使用可选的 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-30
          • 1970-01-01
          相关资源
          最近更新 更多