Strukturer i Golang är en av de mest använda och ett sätt att skapa användardefinierade typer.
I detta kommer jag att täcka alla grunderna om strukturer och hur du använder dem i dina go-program med ett par exempel.
Låt oss börja!
Introduktion
A struktur är en samling av flera datafält med deras definierade datatyper grupperade tillsammans. De är användbara för att gruppera data tillsammans för att bilda anpassade poster. En struct består av både inbyggda och användardefinierade typer (struct i sig är en användardefinierad typ).
Strukturer i Golang är föränderliga, dvs de kan modifieras genom hela programmet.
Strukturer hjälper till att förbättra den övergripande kodkvaliteten genom att tillåta oss att skapa och skicka komplexa datastrukturer över flera moduler. Föreställ dig att skicka 10 parametrar till en funktion, du kommer snart att fly från kod. Det är precis därför structs är användbara, nu istället för 10 parametrar skickar du helt enkelt en enda struct till den funktionen.
En struct deklareras med två nyckelord – typ och struktur. Det är insvept med krulliga parenteser (precis som klasser i java) – som innehåller en uppsättning fält som har en definierad typ och en identifierare (namn). Vi diskuterar implementeringsdetaljerna i nästa avsnitt.
Om du kommer från en bakgrund med objektorienterad programmering (OOP) kan du tänka på struct som en klass men utan arv.
Deklarerar strukturer
Nu när du förstår vad en struktur är och varför den används, är det dags att lära dig hur man deklarerar strukturer. Det grundläggande skelettet i en struktur ser ut som –
type name_of_struct struct { field1 data_type_field1 field2 data_type_field2 }
Här är typ och struct nyckelord, medan struct innehåller flera fält med deras definierade datatyp.
Låt oss se ett exempel –
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { var user User fmt.Println(user) }
Här definierar vi en användarstruktur som består av sträng-, int- och float32-fält. I main() deklarerar vi vår struct som användare och skriver ut den! Utdata vi får är noll/tomt värde av struct eftersom vi inte har initierat det ännu! De noll värde är i princip noll värden för varje fält.
{ 0 0}
Initialisering av strukturer
I föregående avsnitt lärde vi oss hur man deklarerar strukturer. Nu skulle vi vilja initiera eller tilldela dem värden. Kontrollera koden nedan om hur vi gör det –
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) }
Själva koden förklarar hur vi initierar två strukturer med och utan fältnamn. Här blir utgången –
{Mohit 24 100} {Nidhi 21 1000}
I ovanstående fall, om ett av fälten inte initieras, kommer det fältet att ha sitt nollvärde som standard.
user1 := User{ name: "Mohit", age: 24, } // Output - { Mohit 24 0.0 }
Det finns ytterligare ett sätt att skapa strukturer med nya nyckelord. Vi kommer att titta på hur man använder det i nästa avsnitt.
Åtkomst till fält i en struktur
Nu vet vi hur man skapar och initierar strukturer, låt oss se hur man kommer åt fälten i en struktur. För detta förser Golang oss med punktoperatorn. Fortsätt med föregående exempel, låt oss komma åt namn- och åldersfält och skriva ut dem.
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) }
Här använder vi struct_name.field_name för att komma åt fält i en struct. Utdata från ovanstående kod kommer att vara –
Mohit 24 100
Som nämnts tidigare kan vi skapa strukturer med nya nyckelord. Låt oss se hur –
user := new(User) user.name = "Mohit" user.age = 24 user.bankBalance = 100.0 fmt.Println(user) // Output - &{Mohit 24 100}
Det nya nyckelordet returnerar pekaren till den initierade strukturen. I Golang behöver du inte uttryckligen avreferera pekaren men fmt.Println(*user) skulle resultera i samma utdata.
Kapslade strukturer
Strukturer i golang kan också innehålla andra användardefinierade typer. Så en struktur kan innehålla andra kapslade strukturer.
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) }
I koden ovan har vi RoleDetails struct som en del av User struct. Utgången blir –
{Mohit 24 100 {Software Engineer Transport}}
Om du vill komma åt roleDetails kan du göra det med samma punktoperator –
user.roleDetails.position
Strukturera jämställdhet
Två strukturer är lika om vart och ett av fälten de har är lika (både inbyggda och användardefinierade) men inte alla datatyper är jämförbara. (karta är inte direkt jämförbar). Låt oss se ett exempel för att visa jämlikhet.
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") } }
Tomma och nollvärdesstrukturer är lika. Fältordningen spelar ingen roll, i grund och botten bör varje fält matcha för jämlikhet. Utdata för koden ovan blir –
user1 and user2 are equal user1 and user3 are not equal
Slutsats
Grymt bra!
Nu är du redo att använda strukturer i golang. Vi täckte alla grunderna som deklaration, initiering och åtkomst till struct-fält. Vi tittade också på hur man jämför två strukturer och implementerade till och med en kapslad struktur. Här är några resurser för att lära dig mer om strukturer –
Det finns mycket mer att lära sig om strukturer, men det är en bra början för nu. Jag hoppas att du lärde dig något nytt!
Fortsätt utforska. Fortsätt lära!