2015-03-02 100 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