结构体字面量使用未命名字段

7
我的目标是将功能嵌入到现有类型中。
我正在遵循Effective Go
问题是它警告var parent *embedding.Parent github.com/kidfrom/learn-golang/embedding.Child struct literal uses unkeyed fields
当前的解决方案是创建NewChild(parent *Parent) *Child。然而,我担心这只是在愚弄编译器,在未来会出现意外的恐慌,那么我做错了什么?
func NewChild(parent *Parent) *Child {
    return &Child{parent}
}

cmd/test/main.go

package main

import "github.com/kidfrom/learn-golang/embedding"

func main() {
    parent := &embedding.Parent{}
    child := &embedding.Child{parent} // it warns `var parent *embedding.Parent
github.com/kidfrom/learn-golang/embedding.Child struct literal uses unkeyed fields`
    child.CallParentMethod()
}

embedding.go

package embedding

import "fmt"

type Parent struct{}

func (p *Parent) parentMethod() {
    fmt.Println("parent method")
}

type Child struct {
    *Parent
}

func (c *Child) CallParentMethod() {
    c.parentMethod()
}

这里有一个很好的解释:https://dev59.com/DVQJ5IYBdhLWcg3wHSE8#63747469 - FelixEnescu
2个回答

6

你收到的警告很可能来自于 go-staticcheck。如果运行以下命令,您也会看到类似的警告:

$ go vet

./main.go:8:12: github.com/kidfrom/learn-golang/embedding.Child composite literal uses unkeyed fields

查看您正在导入的软件包的文档:

$ go doc "github.com/kidfrom/learn-golang/embedding" Child

package embedding // import "github.com/kidfrom/learn-golang/embedding"

type Child struct {
        *Parent
}

func NewChild(parent *Parent) *Child
func (c *Child) CallParentMethod()

显示Child中嵌入类型为Parent,因此为了解决警告,需要将值显式地分配给这个(嵌入结构体)字段:

child := &embedding.Child{Parent: parent}

1

您可以通过在Child结构体中的*Parent属性上添加一个键来解决警告。例如:

type Child struct {
    Parent *Parent
}

并且调整您在主函数中child属性的初始化方式,如下所示:

child := &embedding.Child{Parent: parent}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接