2015-03-02 102 views
12

我有下面的函数接受布尔指针。我想知道是否有任何符号允许我在结构字面量中将is字段的值设置为true;基本上没有定义一个新的标识符(i.e. var x := true ; handler{is: &x})如何在结构体字符中将bool指针设置为true?

package main 

import "fmt" 

func main() { 
    fmt.Println("Hello, playground") 
    check(handler{is: new(bool) }) 
} 


type handler struct{ 
    is *bool 
} 

func check(is handler){} 
+0

相关:http:// stackoverflow。com/questions/30716354/how-do-a-literal-int64-in-go – icza 2015-06-10 09:17:11

回答

11

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

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

基本上它创建了一个切片与价值true一个bool,索引的第一个元素,并采用其地址。没有新的变量被创建,但有很多样板(并且后备数组将保留在内存中直到其第一个元素的地址存在)。

一个更好的解决办法是写一个辅助函数:

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?

+0

我想我必须使用丑陋的bools b/c语法作为命令参数提供给生成器所以我买不起帮手功能。 – 2015-03-02 20:08:47

+3

哈,我忘了那个把戏! (不是我会用它) – JimB 2015-03-02 20:09:27

+1

@Theuserwithnohat我不明白为什么你的情况下不会允许一个函数。谨慎分享更多细节? – icza 2015-03-02 20:15:51

3

没有语法来定义一个指针指向一个基本类型,比new返回零值其他。数字类型和字符串也是一样。

您需要先手动创建一个值来获取地址,或者创建一个零值的指针,然后在事实之后分配一个新值。

0

一个为什么指针在走或任何与此有关的语言有帮助的原因,是他们帮助我们“按引用传递”。所以如果我们通过引用传递任何东西,我们就可以“改变”那件事。即使在函数返回后,一个将指针指向bool的函数也可以有效地更改bool的值。这是我们不想用常量的事情,即。他们的价值观不应该改变。因此这个限制是有道理的。

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