2017-05-05 101 views
1

我試圖給一個指向結構成員的值賦予一個指針,但它給出了「panic:runtime error:invalid memory address or nil pointer dereference」at運行時...Golang:爲結構成員分配一個值,這是一個指針

package main 

import (
    "fmt" 
    "strconv" 
) 

// Test 
type stctTest struct { 
    blTest *bool 
} 

func main() { 

    var strctTest stctTest 
    *strctTest.blTest = false 

    fmt.Println("Test is " + strconv.FormatBool(*strctTest.blTest)) 

} 

運行時錯誤似乎來自賦值* strctTest.blTest = false,但爲什麼?我如何將它設置爲false?

+0

下面是Go中指針的一個很好的解釋:https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money -back – fhe

回答

6

爲什麼它是一個錯誤?因爲一個指針只指向。它不會創造任何東西指向AT。你需要這樣做。

如何將其設置爲false?這一切都取決於爲什麼你讓它成爲一個指針。

這是否應該指向相同的布爾的每一個副本?然後應該在創建函數中分配一些空間。

func NewStruct() *strctTest { 
    bl := true 
    return &strctTest{ 
     blTest: &bl, 
    } 
} 

用戶是否應該將它指向他自己的布爾值?然後應該在創建對象時手動設置。

func main() { 
    myBool := false 
    stctTest := strctTest{ 
     blTest: &myBool 
    } 

    fmt.Println("Test is " + strconv.FormatBool(*strctTest.blTest)) 

} 
+0

我試圖嘗試第一種方法給出了一個編譯器錯誤(「無效指針類型* bool複合文字」),但第二種方法適用於我的目的。謝謝! –

+0

@BartSilverstrim啊,我沒有測試它。我想我應該有。 –

+0

@BartSilverstrim我修正了我的第一個例子。 –

1

另一種可以想到的方式是布爾值的零值爲false。

這不是那麼清楚,而是另一種方式來做到這一點。

https://play.golang.org/p/REbnJumcFi

我會建議New() FUNC返回到初始化結構類型的引用。

相關問題