Golang:为结构体成员赋值,该成员是指针

aamkag61  于 2022-12-07  发布在  Go
关注(0)|答案(4)|浏览(253)

我试图给一个指针结构体成员赋值,但是它给出了“panic:运行时错误:运行时内存地址无效或空指针取消引用”...

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?

h9vpoimq

h9vpoimq1#

为什么会出错呢?因为指针只能指向,不能创建指向 AT 的内容,你需要这样做。
如何将其设置为false?这完全取决于 * 为什么 * 将其设置为指针。
它的每个副本都应该指向同一个bool吗?那么它应该在创建函数中分配一些空间。

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))

}
aiqt4smr

aiqt4smr2#

另一种说法是布尔值的零值为假。
这不是那么清楚,而是另一种方法。
https://play.golang.org/p/REbnJumcFi
我建议使用New()函数,它返回对初始化的结构类型的引用。

jw5wzhpr

jw5wzhpr3#

您还可以执行以下操作:

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

yhived7q

yhived7q4#

根据JTs Answer,我还建议使用new函数,如下所示:

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()初始化内存后,可以直接给解引用的指针赋值,这样就不需要再用另一个变量来获取地址。
https://go.dev/play/p/BmekoTalQVh

相关问题