新手在此:) 我听不懂

当我在一个文件中执行此操作时:

scratch.go

package main

import "fmt"

type foo struct {
    field1 string
    field2 string
}

type bar struct {
    foo
    field3 string
    field4 string
}

func main() {
    fooBar := bar{
        foo{
            "apples",
            "banana",
        },
        "spam",
        "eggs",
    }
    fmt.Printf("%#v\n", fooBar)

}

它起作用了 但当我有3个这样的文件时

rootproject
├── magazine
│   ├── address.go
│   └── employee.go
└── main.go

magazine/address.go

package magazine

type Address struct {
    Street     string
    City       string
    State      string
    PostalCode string
}

magazine/employee.go

package magazine

type Employee struct {
    Name   string
    Salary float64
    Address
}

main.go

package main

import (
    "fmt"
    "magazine"
)

func main() {
    employee := magazine.Employee{
        Name:   "pogi",
        Salary: 69420,
        magazine.Address{
            Street:     "23 pukinginamo st.",
            City:       "bactol city",
            State:      "betlog",
            PostalCode: "23432",
        },
    }

    fmt.Printf("%#v\n", employee)

}

错误:(

mixture of field:value and value elements in struct literal

我不明白,我做错了什么?我想如果该 struct 是嵌套的,那么它被称为嵌入在外部 struct 中,我可以从外部 struct 访问内部 struct 的字段.这是我的第一个示例(单数文件)的情况,但当我在包中执行时.不同吗?

推荐答案

我想,如果 struct 是嵌套的,那么它就被嵌入到外部 struct 中,我可以从外部 struct 访问内部 struct 的字段.

可以,您可以直接访问嵌入字段的成员,但这不适用于使用composite literal构造 struct 时.如果您仔细查看 struct 文字的规则,您会发现这条规则:

如果任何元素都有键,那么每个元素都必须有键.

无论字段是否嵌入,此规则都适用.


要修复该错误,您可以删除其他键:

func main() {
    employee := magazine.Employee{
        "pogi",
        69420,
        magazine.Address{
            Street:     "23 pukinginamo st.",
            City:       "bactol city",
            State:      "betlog",
            PostalCode: "23432",
        },
    }
    fmt.Printf("%#v\n", employee)
}

或者,您可以指定所有密钥:

func main() {
    employee := magazine.Employee{
        Name:   "pogi",
        Salary: 69420,
        Address: magazine.Address{
            Street:     "23 pukinginamo st.",
            City:       "bactol city",
            State:      "betlog",
            PostalCode: "23432",
        },
    }
    fmt.Printf("%#v\n", employee)
}

请注意,对于嵌入的字段,可以使用类型的非限定名称来引用嵌入的字段.

https://go.dev/ref/spec#Struct_types:

用类型声明但没有显式字段名的字段称为嵌入字段.嵌入的字段必须指定为类型名称T或指向非接口类型名称*T的指针,并且T本身不能是指针类型.The unqualified type name acts as the field name.

Go相关问答推荐

Kafka golang 生产者在错误后更改分区计数

Golang text/template中的startswith函数 - 入门教程

AWS Lambda 中的 Websocket URL 超时达到错误

同一文件上的多个 Arrow CSV 阅读器返回 null

我无法使用反向代理更改主机标头

闭包所处的环境范围是什么?

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

没有任务角色的 AWS CDK ECS 任务定义

查找、解析和验证邮箱地址

从 os.stdout 读取

如何编写一个以字符串或错误为参数的通用函数?

如何使用 Go 获取 X11 中的窗口列表

Golang prometheus 显示自定义指标

Golang BigInt 部门

即使一个测试用例失败,如何运行所有测试用例

是否可以使用按位运算在随机 unicode 字符串中找到重复字符?

不能使用 *T 类型的变量作为参数类型

泛型:对具有返回自身的函数的类型的约束

手动下载并放置一个 golang mod 文件

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)