Κατασκευές στο Golang

Οι δομές στο Golang είναι ένα από τα πιο χρησιμοποιούμενα και ένας τρόπος δημιουργίας τύπων που καθορίζονται από το χρήστη.

Σε αυτό, θα καλύψω όλα τα βασικά σχετικά με τις δομές και τον τρόπο χρήσης τους στα προγράμματα go σας με μερικά παραδείγματα.

Ας αρχίσουμε!

Εισαγωγή

ΕΝΑ struct είναι μια συλλογή πολλαπλών πεδίων δεδομένων με τους καθορισμένους τύπους δεδομένων τους ομαδοποιημένους. Είναι χρήσιμα για την ομαδοποίηση δεδομένων για τη δημιουργία προσαρμοσμένων εγγραφών. Μια δομή αποτελείται τόσο από ενσωματωμένους τύπους όσο και από τύπους που καθορίζονται από το χρήστη (η ίδια η δομή είναι τύπος που ορίζεται από το χρήστη).

Οι δομές στο Golang είναι μεταβλητές, δηλαδή μπορούν να τροποποιηθούν σε όλο το πρόγραμμα.

Οι δομές βοηθούν στη βελτίωση της συνολικής ποιότητας του κώδικα, επιτρέποντάς μας να δημιουργήσουμε και να διαβιβάσουμε σύνθετες δομές δεδομένων σε πολλαπλές ενότητες. Φανταστείτε να περάσετε 10 παραμέτρους σε μια συνάρτηση, σύντομα θα ξεφύγετε από τον κώδικα. Αυτός είναι ακριβώς ο λόγος για τον οποίο τα structs είναι χρήσιμα, τώρα αντί για 10 παραμέτρους περνάτε απλώς μια μεμονωμένη δομή σε αυτήν τη συνάρτηση.

Μια δομή δηλώνεται χρησιμοποιώντας δύο λέξεις-κλειδιά – τύπος και δομή. Είναι τυλιγμένο με σγουρές αγκύλες (όπως ακριβώς οι κλάσεις στη java) – το οποίο περιέχει ένα σύνολο πεδίων που έχουν καθορισμένο τύπο και ένα αναγνωριστικό(όνομα). Συζητάμε τις λεπτομέρειες εφαρμογής στην επόμενη ενότητα.

  Επεξήγηση συχνοτήτων και ρυθμίσεων ισοσταθμιστή σε συσκευές αναπαραγωγής μουσικής

Εάν προέρχεστε από ένα υπόβαθρο Αντικειμενοστρεφούς Προγραμματισμού (OOP), μπορείτε να σκεφτείτε τη δομή ως κλάση αλλά χωρίς κληρονομικότητα.

Δήλωση δομών

Τώρα, που καταλαβαίνετε τι είναι μια δομή και γιατί χρησιμοποιείται, ήρθε η ώρα να μάθετε πώς να δηλώνετε structs. Ο βασικός σκελετός μιας κατασκευής μοιάζει με –

type name_of_struct struct { 
     field1 data_type_field1 
     field2 data_type_field2 
 }

Εδώ, ο τύπος και η δομή είναι λέξεις-κλειδιά, ενώ η δομή περιέχει πολλά πεδία με τον καθορισμένο τύπο δεδομένων τους.

Ας δούμε ένα παράδειγμα –

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	var user User
	fmt.Println(user)
}

Εδώ, ορίζουμε μια δομή χρήστη που αποτελείται από πεδία string, int και float32. Στο main() δηλώνουμε το struct μας ως χρήστη και το εκτυπώνουμε! Η έξοδος που παίρνουμε είναι μηδενική/κενή τιμή της δομής μιας και δεν την έχουμε αρχικοποιήσει ακόμα! ο μηδενική τιμή είναι βασικά μηδενικές τιμές κάθε πεδίου.

{ 0 0}

Αρχικοποίηση δομών

Στην προηγούμενη ενότητα, μάθαμε πώς να δηλώνουμε δομές. Τώρα, θα θέλαμε να αρχικοποιήσουμε ή να τους εκχωρήσουμε τιμές. Ελέγξτε τον παρακάτω κώδικα για το πώς το κάνουμε αυτό –

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

Ο ίδιος ο κώδικας εξηγεί πώς αρχικοποιούμε δύο δομές με και χωρίς ονόματα πεδίων. Εδώ, η έξοδος θα είναι –

{Mohit 24 100}
 {Nidhi 21 1000}

Στην παραπάνω περίπτωση, εάν ένα από τα πεδία δεν έχει αρχικοποιηθεί, τότε αυτό το πεδίο ορίζει την μηδενική του τιμή.

user1 := User{
	name:        "Mohit",
	age:         24,
}

 // Output - { Mohit 24 0.0 }

Υπάρχει ένας ακόμη τρόπος για να δημιουργήσετε δομές χρησιμοποιώντας νέα λέξη-κλειδί. Θα δούμε πώς να το χρησιμοποιήσετε στην επόμενη ενότητα.

  Πώς λειτουργεί ο έλεγχος ταυτότητας Kerberos;

Πρόσβαση στα πεδία μιας δομής

Τώρα ξέρουμε πώς να δημιουργήσουμε και να αρχικοποιήσουμε δομές, ας δούμε πώς να αποκτήσουμε πρόσβαση στα πεδία μιας δομής. Για αυτό, το Golang μας παρέχει τον τελεστή τελείας. Συνεχίζοντας με το προηγούμενο παράδειγμα, ας αποκτήσουμε πρόσβαση στα πεδία ονόματος και ηλικίας και ας τα εκτυπώσουμε.

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

Εδώ, χρησιμοποιούμε struct_name.field_name για πρόσβαση σε πεδία σε μια δομή. Η έξοδος του παραπάνω κώδικα θα είναι –

Mohit
 24
 100

Όπως αναφέρθηκε προηγουμένως, μπορούμε να δημιουργήσουμε δομές με νέα λέξη-κλειδί. Ας δούμε πώς –

user := new(User)
 user.name = "Mohit"
 user.age = 24
 user.bankBalance = 100.0

 fmt.Println(user)

 // Output - &{Mohit 24 100}

Η νέα λέξη-κλειδί επιστρέφει τον δείκτη στην αρχικοποιημένη δομή. Στο Golang δεν χρειάζεται να απορρίψετε ρητά τον δείκτη, αλλά το fmt.Println(*user) θα είχε ως αποτέλεσμα την ίδια έξοδο.

Ένθετες κατασκευές

Οι δομές στο golang μπορούν να περιέχουν και άλλους τύπους που ορίζονται από το χρήστη. Έτσι, μια δομή μπορεί να περιέχει άλλες ένθετες δομές.

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

Στον παραπάνω κώδικα, έχουμε τη δομή RoleDetails ως μέρος της δομής χρήστη. Η έξοδος θα είναι –

{Mohit 24 100 {Software Engineer Transport}}

Εάν θέλετε να αποκτήσετε πρόσβαση στο roleDetails, μπορείτε να το κάνετε χρησιμοποιώντας τον ίδιο τελεστή κουκκίδας –

  Πώς να διορθώσετε το βρόχο εκκίνησης του iPhone από το σφάλμα χαρακτήρων των Τελούγκου

user.roleDetails.position

Δομική Ισότητα

Δύο δομές είναι ίσες εάν καθένα από τα πεδία που έχουν είναι ίσο (τόσο ενσωματωμένο όσο και καθορισμένο από τον χρήστη), αλλά δεν είναι όλοι οι τύποι δεδομένων συγκρίσιμοι. (ο χάρτης δεν είναι άμεσα συγκρίσιμος). Ας δούμε ένα παράδειγμα για να καταδείξουμε την ισότητα.

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

Οι δομές κενού και μηδενικής τιμής είναι ίσες. Η σειρά των πεδίων δεν έχει σημασία, βασικά, κάθε πεδίο πρέπει να ταιριάζει για ισότητα. Η έξοδος για τον παραπάνω κώδικα θα είναι –

user1 and user2 are equal
user1 and user3 are not equal

συμπέρασμα

Φοβερός!

Τώρα είστε έτοιμοι να χρησιμοποιήσετε δομές σε golang. Καλύψαμε όλα τα βασικά όπως δήλωση, αρχικοποίηση και πρόσβαση σε πεδία struct. Εξετάσαμε επίσης πώς να συγκρίνουμε δύο δομές και ακόμη και εφαρμόσαμε μια ένθετη δομή. Ακολουθούν μερικοί πόροι για να μάθετε περισσότερα σχετικά με τις δομές –

Υπάρχουν πολλά περισσότερα να μάθετε για τις κατασκευές, αλλά είναι μια καλή αρχή προς το παρόν. Ελπίζω να έμαθες κάτι νέο!

Συνεχίστε την εξερεύνηση. Συνέχισε να μαθαίνεις!