Struktury v Golangu jsou jedním z nejpoužívanějších a způsobem, jak vytvářet uživatelsky definované typy.
V tomto budu pokrývat všechny základy o strukturách a jejich použití ve vašich go programech na několika příkladech.
Začněme!
Table of Contents
Úvod
A strukturovat je kolekce více datových polí s jejich definovanými datovými typy seskupenými dohromady. Jsou užitečné pro seskupování dat do vlastních záznamů. Struktura se skládá z vestavěných i uživatelem definovaných typů (samotná struktura je typ definovaný uživatelem).
Struktury v Golangu jsou proměnlivé, tj. mohou být modifikovány v průběhu programu.
Struktury pomáhají zlepšit celkovou kvalitu kódu tím, že nám umožňují vytvářet a předávat složité datové struktury napříč více moduly. Představte si předání 10 parametrů do funkce, brzy vám uteče kód. To je přesně důvod, proč jsou struktury užitečné, nyní místo 10 parametrů jednoduše předáte této funkci jedinou strukturu.
Struktura je deklarována pomocí dvou klíčových slov – typ a strukturovat. Je zabalena do složených závorek (stejně jako třídy v jazyce Java) – která obsahuje sadu polí, která mají definovaný typ a identifikátor (název). Podrobnosti implementace probereme v další části.
Pokud pocházíte z objektově orientovaného programování (OOP), můžete si struct představit jako třídu, ale bez dědičnosti.
Deklarace struktur
Nyní, když chápete, co je struktura a proč se používá, je čas naučit se deklarovat struktury. Základní kostra struktury vypadá takto –
type name_of_struct struct { field1 data_type_field1 field2 data_type_field2 }
Zde jsou typ a struktura klíčová slova, zatímco struktura obsahuje více polí s jejich definovaným datovým typem.
Podívejme se na příklad –
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { var user User fmt.Println(user) }
Zde definujeme uživatelskou strukturu, která se skládá z polí string, int a float32. V main() deklarujeme naši strukturu jako uživatelskou a vytiskneme ji! Výstup, který dostáváme, je nulová/prázdná hodnota struct, protože jsme ji ještě neinicializovali! The nulová hodnota je v podstatě nulová hodnota každého pole.
{ 0 0}
Inicializace struktur
V předchozí části jsme se naučili, jak deklarovat struktury. Nyní bychom jim chtěli inicializovat nebo přiřadit hodnoty. Podívejte se na kód níže, jak to děláme –
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { // With field names user1 := User{ name: "Mohit", age: 24, bankBalance: 100.0, } // Without field names user2 := User{"Nidhi", 21, 1000.0} fmt.Println(user1) fmt.Println(user2) }
Samotný kód vysvětluje, jak inicializujeme dvě struktury s názvy polí a bez nich. Zde bude výstupem –
{Mohit 24 100} {Nidhi 21 1000}
Pokud ve výše uvedeném případě není jedno z polí inicializováno, má toto pole výchozí hodnotu nula.
user1 := User{ name: "Mohit", age: 24, } // Output - { Mohit 24 0.0 }
Existuje ještě jeden způsob, jak vytvořit struktury pomocí nového klíčového slova. Na to, jak jej používat, se podíváme v další části.
Přístup k polím struktury
Nyní víme, jak vytvářet a inicializovat struktury, podívejme se, jak přistupovat k polím struktury. Za tímto účelem nám Golang poskytuje operátor tečky. Pokračujeme v předchozím příkladu, zpřístupníme pole jména a věku a vytiskneme je.
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { // With field names user := User{ name: "Mohit", age: 24, bankBalance: 100.0, } fmt.Println(user.name) fmt.Println(user.age) fmt.Println(user.bankBalance) }
Zde používáme struct_name.field_name pro přístup k polím ve struktuře. Výstupem výše uvedeného kódu bude –
Mohit 24 100
Jak již bylo zmíněno dříve, můžeme vytvářet struktury s novým klíčovým slovem. Podívejme se jak –
user := new(User) user.name = "Mohit" user.age = 24 user.bankBalance = 100.0 fmt.Println(user) // Output - &{Mohit 24 100}
Klíčové slovo new vrátí ukazatel na inicializovanou strukturu. V Golangu nemusíte explicitně dereferencovat ukazatel, ale fmt.Println(*user) by vedl ke stejnému výstupu.
Vnořené struktury
Struktury v golangu mohou obsahovat i další uživatelem definované typy. Struktura tedy může obsahovat další vnořené struktury.
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 roleDetails RoleDetails } type RoleDetails struct { position string team string } func main() { roleDetailForMohit := RoleDetails{ position: "Software Engineer", team: "Transport", } user := User{ name: "Mohit", age: 24, bankBalance: 100.0, roleDetails: roleDetailForMohit, } fmt.Println(user) }
Ve výše uvedeném kódu máme strukturu RoleDetails jako součást uživatelské struktury. Výstupem bude –
{Mohit 24 100 {Software Engineer Transport}}
Pokud chcete získat přístup k detailům role, můžete to udělat pomocí stejného operátoru tečky –
user.roleDetails.position
Rovnost struktury
Dvě struktury jsou stejné, pokud je každé z polí, které mají, stejné (vestavěné i uživatelem definované), ale ne všechny datové typy jsou srovnatelné. (mapa není přímo srovnatelná). Podívejme se na příklad pro demonstraci rovnosti.
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { user1 := User{ name: "Mohit", age: 24, bankBalance: 100.0, } user2 := User{ name: "Mohit", age: 24, bankBalance: 100.0, } user3 := User{ name: "Nidhi", age: 21, bankBalance: 1000.0, } if user1 == user2 { fmt.Println("user1 and user2 are equal") } else { fmt.Println("user1 and user2 are not equal") } if user1 == user3 { fmt.Println("user1 and user3 are equal") } else { fmt.Println("user1 and user3 are not equal") } }
Prázdné a nulové struktury jsou stejné. Na pořadí polí nezáleží, v zásadě by každé pole mělo odpovídat rovnosti. Výstup pro kód výše bude –
user1 and user2 are equal user1 and user3 are not equal
Závěr
Úžasný!
Nyní jste připraveni používat struktury v golangu. Pokryli jsme všechny základy, jako je deklarace, inicializace a přístup k polím struct. Podívali jsme se také na to, jak porovnat dvě struktury, a dokonce jsme implementovali vnořenou strukturu. Zde je několik zdrojů, kde se dozvíte více o strukturách –
O strukturách se lze dozvědět mnohem více, ale prozatím je to dobrý začátek. Doufám, že jste se naučili něco nového!
Pokračujte ve zkoumání. Stále se uč!