Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将结构转换为*接口{}_Go - Fatal编程技术网

Go 将结构转换为*接口{}

Go 将结构转换为*接口{},go,Go,我正在使用checkr/goflagr,特别是试图构建一个并填充EntityContext字段(为了简洁起见,下面删除了一些内容) 类型EvalContext结构{ EntityContext*接口{}`json:“EntityContext,省略空”` //弗拉基德 FlagID int64`json:“FlagID,省略空”` } 这段代码是由SwaggerGen生成的,我不知道如何在没有一些糟糕的解决方法的情况下向这个函数发送一个结构 我的直觉告诉我应该能够传递结构实例的地址,例如 类型

我正在使用
checkr/goflagr
,特别是试图构建一个并填充EntityContext字段(为了简洁起见,下面删除了一些内容)

类型EvalContext结构{
EntityContext*接口{}`json:“EntityContext,省略空”`
//弗拉基德
FlagID int64`json:“FlagID,省略空”`
}
这段代码是由SwaggerGen生成的,我不知道如何在没有一些糟糕的解决方法的情况下向这个函数发送一个结构

我的直觉告诉我应该能够传递结构实例的地址,例如

类型entityContext结构{
环境字符串`json:“环境”`
}
entityContextImpl:=entityContext{Environment:“prod”}
eval_ctx:=goflagr.EvalContext{
FlagID:int64(19),
EntityContext:&entityContextImpl,
}
但这一点在某些情况下是行不通的

cannot use &entityContextImpl (type *entityContext) as type *interface {} in field value:
    *interface {} is pointer to interface, not interface
我已通过以下解决方法使其工作:


func convertToStarInterface(i接口{})*接口{}{
返回&i
}
func myFunc(){
类型entityContext结构{
环境字符串`json:“环境”`
}
entityContextImpl:=entityContext{Environment:“prod”}
ec:=goflagr.EvalContext{
FlagID:int64(18),
EntityContext:convertToStarInterface(entityContextImpl),
}
}

但是感觉必须有一种方法来避免必须使用这个转换函数,一个
*接口{}
是最丑陋的。完全可以使用接口{}实现
ommitempty
,因为
接口{}
可以为零。你应该考虑为此提交一个bug。无论如何

如果需要传递
*接口{}
,可以执行以下操作:

var i interface{}
i=someStruct{}
ctx.EntityContext=&i

您的函数也可以工作,但是,它不一定高效或者看起来更简单。

,其余的都可以不加修改地工作。是的,
entityContext
字段不是必需的,它只是一个
*接口{}
。这很有效,@zerkms的评论也很有效,这基本上是一样的,但是在var声明和赋值中,这在我看来要好看得多