【问题标题】:Golang: Assigning a value to struct member that is a pointerGolang:为作为指针的结构成员赋值
【发布时间】:2017-05-05 18:31:02
【问题描述】:

我正在尝试为作为指针的结构成员分配一个值,但它在运行时给出“恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”...

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?

【问题讨论】:

标签: pointers go struct


【解决方案1】:

为什么会出错?因为指针只指向。它不会创建任何指向 AT 的东西。你需要这样做。

如何设置为假?这一切都取决于为什么你把它变成了一个指针。

这个的每个副本都应该指向同一个布尔值吗?然后应该在创建函数中分配一些空间。

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

}

【讨论】:

  • 我尝试第一种方法的尝试给出了编译器错误(“无效的指针类型 *bool 用于复合文字”),但第二种方法适用于我的目的。谢谢!
  • @BartSilverstrim 嗯,我没有测试它。我想我应该有。
  • @BartSilverstrim 我修复了我的第一个示例。
【解决方案2】:

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

这不是很清楚,而是另一种方法。

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

我会推荐一个 New() 函数,它返回对初始化结构类型的引用。

【讨论】:

  • 这并没有真正回答 OP 的问题。他问的是如何为布尔值赋值,而不是如何进行新的内存分配。在您的示例中,您应该添加如何为其分配值。见play.golang.org/p/iqOD5hLcPPp
【解决方案3】:

你也可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2015-12-20
    • 2021-05-22
    相关资源
    最近更新 更多