/ / Перейти тип структури, заповнити вбудоване поле структури - перейти, структурувати

Перехід типу структури, заповнення вбудованого поля 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)
}

Моя думка: потворно, як пекло і схильність до помилок, так як легко пропустити тег або пропустити поле і отримати помилки компілятора, які не корисні. "не проаналізуйте різницю між типом, який ви використовували, і типом, який очікувався, щоб вам було легше, щоб знайти свій пропуск / помилку.)

І я боявся думати про те, як це виглядає, якщо ти почнеш більше наливати ніж один елемент у прямому фрагменті.

І так, ви не можете опускати теги, оскільки вони беруть участь у ідентифікації типу, як зазначено тут специфікація голангу останній абзац перед останнім прикладом коду.

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