/ / Vai tipo struct, compila campo struct incorporato - go, struct

Vai struct type, compila il campo struct embedded - go, struct

Ho il seguente tipo di 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"`
}

Ora uso questa struttura in un progetto completamente diverso, importando il pacchetto, ecc. Fin qui tutto bene, ma poi voglio riempire un'istanza concreta della struttura:

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

Io prima "riempio" i campi radice, ma poi ho bisogno di riempire un array di Formats, ma non so come sia questa sintassi. Qualcuno può indicarmi la giusta direzione?

risposte:

1 per risposta № 1

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

Per non trasmettere solo sui collegamenti, tutto il programma di lavoro:

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

La mia opinione: brutto da morire e soggetto a errori, in quanto è facile perdere un tag o omettere un campo e ottenere errori del compilatore che non sono così utili. (Vi dicono che non si può usare come valore di campo o alcuni di essi, ma non "Analizziamo qual è la differenza tra il tipo che hai usato e il tipo che ci si aspettava, per renderti più facile per te, per trovare la tua omissione / errore di battitura.)

E ho paura di pensare a come sembra se tu cominci a versare di più di un elemento nella porzione letterale.

E sì, non puoi omettere i tag, dato che prendono parte all'identità del tipo, come affermato qui golang spec ultimo paragrafo prima dell'ultimo esempio di codice.

Come grokify sottolineato, non è necessario ripetere il tipo di struct per ogni elemento slice, quindi anche questo funziona:

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

A mio parere leggermente migliore, ma non ancora buono, dato che hai ancora molto lavoro da fare se modifichi il tipo embedded. (In abbinamento al nome del tipo incorporato).


1 per risposta № 2

Assegna un nome a tutti i tipi di struct per evitare di duplicare il tipo di struct in letterali compositi:

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

Ecco un esempio di a letterale composito usando questi tipi:

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