转到struct类型,填充嵌入式struct字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转到struct类型,填充嵌入式struct字段相关的知识,希望对你有一定的参考价值。

我有以下结构类型:

type ExportJob struct {
    AssetID    string `json:"asset_id"`
    ObjectType string `json:"object_type"`
    Usage      string `json:"usage"`
    Reference  string `json:"reference"`
    Chunk      string `json:"chunk_id"`
    Ordering   uint64 `json:"ordering"`
    Formats    []struct {
        SizePreset      string `json:"size_preset"`
        Fit             string `json:"fit"`
        OutputFormat    string `json:"output_format"`
        Location        string `json:"location"`
        BackgroundColor string `json:"background_color"`
        Height          uint64 `json:"height"`
        Width           uint64 `json:"width"`
        Trimfactor      uint64 `json:"trimfactor"`
        Quality         uint64 `json:"quality"`
    } `json:"formats"`
}

现在我在一个完全不同的项目中使用这个结构,通过导入包等等。到目前为止一切都那么好,但后来我想填充结构的具体实例:

job := workers.ExportJob{
    AssetID:    "blablat",
    ObjectType: "blablab",
    Reference:  "blbla",
    Ordering:   0,
    Chunk:      "blablba,
    Formats:    ?????, // how does this syntax looks like??
}

我首先“填充”根域,但后来我需要填充一个Formats数组,但我不知道这个语法是怎样的。有人能指出我正确的方向吗?

答案

https://play.golang.org/p/D17WYx6mRr

为了不在链接上进行中继,整个工作程序:

package main

import (
    "fmt"
)

type ExportJob struct {
    AssetID    string `json:"asset_id"`
    ObjectType string `json:"object_type"`
    Usage      string `json:"usage"`
    Reference  string `json:"reference"`
    Chunk      string `json:"chunk_id"`
    Ordering   uint64 `json:"ordering"`
    Formats    []struct {
        SizePreset      string `json:"size_preset"`
        Fit             string `json:"fit"`
        OutputFormat    string `json:"output_format"`
        Location        string `json:"location"`
        BackgroundColor string `json:"background_color"`
        Height          uint64 `json:"height"`
        Width           uint64 `json:"width"`
        Trimfactor      uint64 `json:"trimfactor"`
        Quality         uint64 `json:"quality"`
    } `json:"formats"`
}

func main() {
    job := ExportJob{
        AssetID:    "blablat",
        ObjectType: "blablab",
        Reference:  "blbla",
        Ordering:   0,
        Chunk:      "blablba",
        Formats: []struct {
            SizePreset      string `json:"size_preset"`
            Fit             string `json:"fit"`
            OutputFormat    string `json:"output_format"`
            Location        string `json:"location"`
            BackgroundColor string `json:"background_color"`
            Height          uint64 `json:"height"`
            Width           uint64 `json:"width"`
            Trimfactor      uint64 `json:"trimfactor"`
            Quality         uint64 `json:"quality"`
        }{struct {
            SizePreset      string `json:"size_preset"`
            Fit             string `json:"fit"`
            OutputFormat    string `json:"output_format"`
            Location        string `json:"location"`
            BackgroundColor string `json:"background_color"`
            Height          uint64 `json:"height"`
            Width           uint64 `json:"width"`
            Trimfactor      uint64 `json:"trimfactor"`
            Quality         uint64 `json:"quality"`
        }{SizePreset: "no",
            Fit:             "blah",
            OutputFormat:    "blub",
            Location:        "loc",
            BackgroundColor: "green",
            Height:          1,
            Width:           2,
            Trimfactor:      4,
            Quality:         7,
        },
        },
    }
    fmt.Println(job)
}

我的观点:因为地狱和容易出错而难看,因为很容易错过标记或省略字段并得到编译器错误,这些错误并没有多大帮助。 (他们告诉你,你不能将它用作字段值或某些类似的东西,但不要分析你使用的类型和预期类型之间的差异,以便更容易找到你的遗漏/错字。)

我害怕思考,如果你开始在切片文字中倒入多个元素,那会是怎样的。

是的,您不能省略标签,因为它们参与类型标识,如此处所述golang spec在最后一个代码示例之前的最后一段。

正如grokify指出的那样,你不需要为每个切片元素重复结构类型,所以这也适用:

package main

import (
    "fmt"
)

type ExportJob struct {
    AssetID    string `json:"asset_id"`
    ObjectType string `json:"object_type"`
    Usage      string `json:"usage"`
    Reference  string `json:"reference"`
    Chunk      string `json:"chunk_id"`
    Ordering   uint64 `json:"ordering"`
    Formats    []struct {
        SizePreset      string `json:"size_preset"`
        Fit             string `json:"fit"`
        OutputFormat    string `json:"output_format"`
        Location        string `json:"location"`
        BackgroundColor string `json:"background_color"`
        Height          uint64 `json:"height"`
        Width           uint64 `json:"width"`
        Trimfactor      uint64 `json:"trimfactor"`
        Quality         uint64 `json:"quality"`
    } `json:"formats"`
}

func main() {
    job := ExportJob{
        AssetID:    "blablat",
        ObjectType: "blablab",
        Reference:  "blbla",
        Ordering:   0,
        Chunk:      "blablba",
        Formats: []struct {
            SizePreset      string `json:"size_preset"`
            Fit             string `json:"fit"`
            OutputFormat    string `json:"output_format"`
            Location        string `json:"location"`
            BackgroundColor string `json:"background_color"`
            Height          uint64 `json:"height"`
            Width           uint64 `json:"width"`
            Trimfactor      uint64 `json:"trimfactor"`
            Quality         uint64 `json:"quality"`
        }{{SizePreset: "no",
            Fit:             "blah",
            OutputFormat:    "blub",
            Location:        "loc",
            BackgroundColor: "green",
            Height:          1,
            Width:           2,
            Trimfactor:      4,
            Quality:         7,
        },
        },
    }
    fmt.Println(job)
}

在我看来稍好一点,但仍然不好,因为如果你改变嵌入式类型,你还有更多的工作要做。 (比较命名嵌入式类型)。

另一答案

命名所有结构类型以避免在composite literals中重复结构类型:

type Format struct {
    SizePreset      string `json:"size_preset"`
    Fit             string `json:"fit"`
    OutputFormat    string `json:"output_format"`
    Location        string `json:"location"`
    BackgroundColor string `json:"background_color"`
    Height          uint64 `json:"height"`
    Width           uint64 `json:"width"`
    Trimfactor      uint64 `json:"trimfactor"`
    Quality         uint64 `json:"quality"`
}

type ExportJob struct {
    AssetID    string   `json:"asset_id"`
    ObjectType string   `json:"object_type"`
    Usage      string   `json:"usage"`
    Reference  string   `json:"reference"`
    Chunk      string   `json:"chunk_id"`
    Ordering   uint64   `json:"ordering"`
    Formats    []Format `json:"formats"`
}

以下是使用这些类型的composite literal的示例:

job := ExportJob{
    AssetID:    "blablat",
    ObjectType: "blablab",
    Reference:  "blbla",
    Ordering:   0,
    Chunk:      "blablba",
    Formats: []Format{
        {SizePreset: "no",
            Fit:             "blah",
            OutputFormat:    "blub",
            Location:        "loc",
            BackgroundColor: "green",
            Height:          1,
            Width:           2,
            Trimfactor:      4,
            Quality:         7,
        },
    },
}

以上是关于转到struct类型,填充嵌入式struct字段的主要内容,如果未能解决你的问题,请参考以下文章

GO语言struct语法

如何从 Mysql 填充 Struct 类型映射

union, enum, and struct, 以及结构填充和位字段实现。

go中的struct

Hive复杂数据类型:array、map、struct

Go中的struct