簡體   English   中英

Golang:為作為指針的結構成員賦值

[英]Golang: Assigning a value to struct member that is a pointer

我正在嘗試為作為指針的結構成員分配一個值,但它在運行時給出“恐慌:運行時錯誤:無效的 memory 地址或零指針取消引用”......

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 的賦值,但為什么呢? 我如何將其設置為假?

為什么是錯誤? 因為一個指針只是指向。 它不會創建任何指向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))

}

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

這不是很清楚,而是另一種方法。

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

我會推薦一個New() func,它返回對初始化結構類型的引用。

您還可以執行以下操作:

package main

import (
    "fmt"
    "strconv"
)

// Test
type stctTest struct {
    blTest *bool
}

func main() {

    strctTest := stctTest{
        blTest: &[]bool{true}[0],
    }

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

}

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

跟進 JTs Answer,我也建議使用new的 function :

package main

import (
    "fmt"
    "strconv"
)

// Test
type stctTest struct {
    blTest *bool
}

func main() {

    strctTest := &stctTest{
        blTest: new(bool),
    }

    *strctTest.blTest = true

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

使用new()初始化 memory 后,您可以直接為取消引用的指針賦值。 這樣您就不需要使用另一個變量來獲取地址。

https://go.dev/play/p/BmekoTalQVh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM