A Go nyelvben a struct névvel ellátott elemek sorozata; ezeket mezőknek hívjuk, és minden mezőnek van neve és típusa.
Egy mező neve a struct-on belül nem ismétlődhet.
A struct fogalmát párhuzamba állíthatjuk az objektumorientált programozás osztályaival.
Új structot a type és a struct kulcsszó használatával hozol létre, és explicit módon megadod a mezők nevét és típusát.
Például itt egy Shape structot definiálunk, amely egy alakzat nevét és méretét tárolja:
type Shape struct {
name string
size int
}
A structok mezőnevei a Go konvencióját követik: a kisbetűvel kezdődő mezők csak az ugyanabban a csomagban lévő kód számára láthatók, a nagybetűvel kezdődők viszont más csomagokból is.
Miután definiáltad a struct-ot, létre kell hoznod egy új példányt, és a mezőket a nevük megadásával, tetszőleges sorrendben beállítod:
s := Shape {
name: "Square",
size: 25,
}
Egy példány mezőinek beolvasásához vagy módosításához a . jelölést használod:
// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35
Azok a mezők, amelyekhez nem rendelsz kezdőértéket, megkapják a zéróértéküket. Például:
s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0
Létrehozhatsz egy struct példányt a mezőnevek használata nélkül is, amíg a mezőket sorrendben adod meg:
s := Shape {
"Oval",
20,
}
Ez a szintaxis azonban törékeny kódnak számít, mert elromolhat, amikor új mező kerül a structba, különösen ha az új mező típusa más.
A következő példában egy plusz mezőt adunk a Shape-hez:
type Shape struct {
name string
description string // new field 'description' added
size int
}
s := Shape{
"Circle",
20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}
Néha jó, ha vannak olyan függvényeink, amelyek segítenek structpéldányokat létrehozni.
A konvenció szerint ezeket a függvényeket általában New-nak hívjuk, vagy a nevük New-val kezdődik, de mivel csak sima függvények, bármilyen nevet adhatsz nekik.
Más nyelvek konstruktorai juthatnak eszedbe róluk, de Go-ban ezek is csak sima függvények.
A következő példában az egyik ilyen New függvénnyel létrehozunk egy új Shape példányt, és automatikusan beállítjuk az alakzat size mezőjének alapértelmezett értékét:
func NewShape(name string) Shape {
return Shape{
name: name,
size: 100, //default-value for size is 100
}
}
NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }
A New függvények használatának a következő előnyei lehetnek:
New függvényeket gyakran ugyanabban a csomagban deklarálják, mint az általuk inicializált structokat, akár a struct privát mezőit is inicializálhatjákHogy mélyebben beleásd magad ebbe a típusba, nézd meg ezeket az anyagokat: Go by Example: Structs, A Tour of Go: Structs vagy Structures in Go (structs)
new beépített függvényEgy structpéldány létrehozásának egy másik módja a new beépített függvény használata:
s := new(Shape) // s will be of type *Shape (pointer to shape)
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: size: 0
Ebben a példában a new létrehozza a Shape struct egy példányát, amelyben minden érték a típusa zéróértékére inicializálódik, és visszaad egy rá mutató pointert.
Többnyire nem fogsz olyan structpéldányokkal találkozni, amelyeket a new beépített függvénnyel hoztak létre.
Mindig részesítsd előnyben a struct literált, egy saját New függvényt vagy bármely más, a csomag által kínált függvényt, amely segít felépíteni egy structot.
A new beépített függvényt csak végső esetben használd új structpéldányok létrehozására.