结构文字使用无键字段

kid*_*rom 8 go

我的目标是将函数嵌入到现有类型中。

我正在关注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}
}
Run Code Online (Sandbox Code Playgroud)

cmd/测试/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()
}
Run Code Online (Sandbox Code Playgroud)

嵌入.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()
}
Run Code Online (Sandbox Code Playgroud)

col*_*tor 8

您收到的警告很可能来自go-staticcheck。通过运行您还会看到类似的警告:

$ go vet

./main.go:8:12: github.com/kidfrom/learn-golang/embedding.Child composite literal uses unkeyed fields
Run Code Online (Sandbox Code Playgroud)

检查您要导入的包的文档:

$ 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()
Run Code Online (Sandbox Code Playgroud)

Child显示is中的嵌入类型Parent,因此要修复警告,请显式将值分配给此(嵌入结构)字段:

child := &embedding.Child{Parent: parent}
Run Code Online (Sandbox Code Playgroud)