У мене такий тип структури:
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)
}
Моя думка: потворно, як пекло і схильність до помилок, так як легко пропустити тег або пропустити поле і отримати помилки компілятора, які не корисні. "не проаналізуйте різницю між типом, який ви використовували, і типом, який очікувався, щоб вам було легше, щоб знайти свій пропуск / помилку.)
І я боявся думати про те, як це виглядає, якщо ти почнеш більше наливати ніж один елемент у прямому фрагменті.
І так, ви не можете опускати теги, оскільки вони беруть участь у ідентифікації типу, як зазначено тут специфікація голангу останній абзац перед останнім прикладом коду.
Як 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"`
}
Ось приклад a складений буквальний використовуючи такі типи:
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,
},
},
}