/ / Go структурен тип, попълнете полето за вградени структури - go, struct

Отидете тип структура, попълнете полето за вградени структури - go, 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, но не знам как изглежда този синтаксис. Може ли някой да ме насочи в правилната посока?

Отговори:

1 за отговор № 1

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)
}

По мое мнение малко по-добре, но все още не е добро, тъй като все още имате повече работа, за да направите, ако промените вградения тип. (В сравнение с именуването на вградения тип).


1 за отговор № 2

Назовете всички типове структури, за да избегнете дублиране на типа на структурата в композитни литерали:

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"`
}

Ето пример за а композитен буквал използвайки тези типове:

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,
},
},
}