Go语言 设置指向空接口的指针

5us2dqdw  于 2023-01-10  发布在  Go
关注(0)|答案(2)|浏览(135)

我们使用openapi-generator来生成一个go-gin-server。这将生成包含*interface{}类型属性的模型。

type Material struct {
    Id *interface{} `json:"id,omitempty"`
    Reference *interface{} `json:"reference,omitempty"`
}

如果我有一个这个结构体的示例,带有nil指针,如何设置这些指针?我尝试了以下方法:

theReturnId := "abc123"
material.Id = &theReturnId

这会产生编译错误:
无法将&theReturnId(类型为 *string的值)用作赋值中的 interface{}值: 字符串不实现 *interface{}(类型 interface{}是指向interface的指针,而不是interface)

theReturnId := "abc123"
*material.Id = theReturnId

这会产生指针为空的运行时错误。
我试过很多其他的方法,但是都没有用。我在这里错过了什么?谢谢!

ijxebb2r

ijxebb2r1#

你几乎不需要一个指向接口的指针,你应该把接口作为值传递,但是底层数据仍然可以是一个指针。
您需要重新考虑您的设计/代码生成技术,不要使用这种方法,因为它不是Go语言的惯用方法。
如果你还想使用它,使用一个类型化的interface{}变量并获取它的地址,你在例子中所做的是不正确的,因为theReturnId是一个字符串类型,获取它的地址意味着*string类型,不能直接赋值给*interface{}类型,因为Go语言是一种强类型语言

package main

import "fmt"

type Material struct {
    Id        *interface{} `json:"id,omitempty"`
    Reference *interface{} `json:"reference,omitempty"`
}

func main() {
    newMaterial := Material{}
    var foobar interface{} = "foobar"
    newMaterial.Id = &foobar
    fmt.Printf("%T\n", newMaterial.Id)
}
erhoui1w

erhoui1w2#

theReturnId := "abc123"
*material.Id = theReturnId

这会产生指针为空的运行时错误。
因为字段Id被设置为它的 * 零值 *,即:nil,取消引用它(*material.Id)会导致运行时错误。您可以为Material编写一个构造函数,初始化其*interface{}字段:

func NewMaterial() Material {
    return Material {
        new(interface{}),
        new(interface{}),
    }
}

现在,您可以安全地取消引用字段Id

material := NewMaterial()
theReturnId := "abc123"
*material.Id = theReturnId

相关问题