Имам следния тип структура:
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 за отговор № 1https://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,
},
},
}