2015-03-02 19 views
12

Aşağıda, bir bool işaretçisini kabul eden bir işlev var. is alanının değerini struct literalde true olarak belirlememi sağlayan herhangi bir gösterim olup olmadığını merak ediyorum; Temel olarak, yeni bir tanımlayıcının (i.e. var x := true ; handler{is: &x})Yapı değişmezinde bool işaretçisini true olarak nasıl ayarlanır?

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

İlgili: http: // stackoverflow.com/questions/30716354/how-do-i-do-a-literal-int64-in-go – icza

cevap

11

Sen bunu yapabilir ama optimum değil:

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

Temel olarak değer true biri bool, endeksler ilk eleman ile bir dilim oluşturur ve adresini alır. Yeni bir değişken oluşturulmaz, ancak çok sayıda boilerplate var (ve backing dizisi, ilk elemanının bulunduğu adrese kadar bellekte kalacak).

Daha iyi bir çözüm bir yardımcı işlevi yazmak olacaktır:

func newTrue() *bool { 
    b := true 
    return &b 
} 

Ve kullanmaktan:

h := handler{is: newTrue()} 
fmt.Println(*h.is) // Prints true 

Ayrıca tek satırlık anonim fonksiyonu ile bunu yapabilirsiniz:

h := handler{is: func() *bool { b := true; return &b }()} 
fmt.Println(*h.is) // Prints true 

Veya bir varyant:

210, tüm seçeneklerini görmek benim diğer cevabı kontrol etmek için: işaretçileri hareket halindeyken ya da bu konuda herhangi bir dilde faydalıdır nedenlerinden How do I do a literal *int64 in Go?

+0

Sanırım bir çifte komut satırı argümanı olarak sağlanmış olan b/c'nin çirkin dilimi ile gitmem gerekiyor. bu yüzden bir yardımcı işlev alamıyorum. –

+3

Ha, bu oyunu unuttum! (kullanacağımdan değil) – JimB

+1

@Theuser neden senin durumun neden bir işleve izin vermeyeceğini anlamıyorum. Daha fazla bilgi paylaşmak ister misiniz? – icza

3

sayılı

new tarafından döndürülen sıfır değeri dışında basit tür bir gösterici tanımlamak için bir sözdizimi vardır tanımlamak olmadan. Aynı şey sayısal türler ve dizgiler için de geçerlidir. El adresini almak veya bir sıfır değeri ile işaretçi oluşturmak ve aslında sonra yeni bir değer atamak önce

Ya bir değer yaratmak gerekir.

0

One, onlar bize "referans geçmek" için yardımcı olduğunu. Yani eğer bir şeyi referans olarak geçersek, o şeyi "değiştirebiliriz". Boole için bir işaretçi alan bir işlev, işlev döndükten sonra bile boole değerini etkin bir şekilde değiştirebilir. Bu, sabitlerle istemediğimiz şey, yani. değerleri değişmemelidir. Dolayısıyla bu kısıtlama mantıklıdır. Yukarıda icza bahsettiği hileler Apart

, burada bir noktayı eklemek isterim. Çoğunlukla, işaretçilerin geçersiz değerlerini etkin bir şekilde kullanmak için doğrudan boole değil de bobinler için işaretçiler kullanırız, aksi takdirde doğru veya yanlış olması gerekir. Eğer durum bu ise, o zaman isteğe bağlı bool bayraklarını doğrudan işlevlerde kullanmak isteyebilirsiniz, örneğin boole işaretçisini veya örnekte gösterildiği gibi tek bir bool işaretçisini sarmalayan bir yapıya sahip olmak yerine, bir yapının tam gereksinimini ortadan kaldırarak Hatta .. Tabii ki, eğer yapının başka bir nedenden dolayı reqd olması durumunda, yukarıdaki hilelerden herhangi birini icza ile çok iyi kullanabilirsiniz. Btw, aşağıdaki adresin aynısını kullanmak için bool değerinin bir kopyasını doğrudan alabilirsiniz.

İlgili konular