Στη Go, ένα struct είναι μια ακολουθία από ονομασμένα στοιχεία που λέγονται πεδία, και κάθε πεδίο έχει ένα όνομα και έναν τύπο.
Το όνομα ενός πεδίου πρέπει να είναι μοναδικό μέσα στο struct.
Τα struct μπορούν να συγκριθούν με τις κλάσεις στο παράδειγμα του αντικειμενοστρεφούς προγραμματισμού.
Δημιουργείς ένα νέο struct χρησιμοποιώντας τις λέξεις-κλειδιά type και struct και ορίζεις ρητά το όνομα και τον τύπο των πεδίων.
Για παράδειγμα, εδώ ορίζουμε το struct Shape, που κρατάει το όνομα ενός σχήματος και το μέγεθός του:
type Shape struct {
name string
size int
}
Τα ονόματα των πεδίων στα struct ακολουθούν τη σύμβαση της Go: τα πεδία των οποίων το όνομα ξεκινά με πεζό γράμμα είναι ορατά μόνο στον κώδικα του ίδιου πακέτου, ενώ εκείνα των οποίων το όνομα ξεκινά με κεφαλαίο γράμμα είναι ορατά και σε άλλα πακέτα.
Αφού ορίσεις το struct, χρειάζεται να δημιουργήσεις ένα νέο στιγμιότυπο ορίζοντας τα πεδία με το όνομά τους, με οποιαδήποτε σειρά:
s := Shape {
name: "Square",
size: 25,
}
Για να διαβάσεις ή να τροποποιήσεις τα πεδία ενός στιγμιοτύπου, χρησιμοποίησε τον συμβολισμό .:
// 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
Τα πεδία στα οποία δεν έχει ανατεθεί αρχική τιμή θα πάρουν τη μηδενική τιμή τους. Για παράδειγμα:
s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0
Μπορείς να δημιουργήσεις ένα στιγμιότυπο ενός struct χωρίς να χρησιμοποιήσεις τα ονόματα των πεδίων, αρκεί να ορίσεις τα πεδία με τη σειρά:
s := Shape {
"Oval",
20,
}
Ωστόσο, αυτή η σύνταξη θεωρείται εύθραυστος κώδικας, αφού μπορεί να σπάσει όταν προστεθεί ένα πεδίο, ειδικά όταν το νέο πεδίο είναι διαφορετικού τύπου.
Στο παρακάτω παράδειγμα προσθέτουμε ένα επιπλέον πεδίο στο Shape:
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{...}
Μερικές φορές είναι βολικό να έχεις συναρτήσεις που σε βοηθούν να δημιουργήσεις στιγμιότυπα struct.
Κατά σύμβαση, αυτές οι συναρτήσεις συνήθως ονομάζονται New ή τα ονόματά τους ξεκινούν με New, αλλά επειδή είναι απλώς κανονικές συναρτήσεις, μπορείς να τους δώσεις όποιο όνομα θέλεις.
Μπορεί να σου θυμίζουν κατασκευαστές σε άλλες γλώσσες, αλλά στη Go είναι απλώς κανονικές συναρτήσεις.
Στο παρακάτω παράδειγμα, μία από αυτές τις συναρτήσεις New χρησιμοποιείται για να δημιουργήσει ένα νέο στιγμιότυπο του Shape και να ορίσει αυτόματα μια προεπιλεγμένη τιμή για το size του σχήματος:
func NewShape(name string) Shape {
return Shape{
name: name,
size: 100, //default-value for size is 100
}
}
NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }
Η χρήση συναρτήσεων New μπορεί να έχει τα ακόλουθα πλεονεκτήματα:
New δηλώνονται συχνά στο ίδιο πακέτο με τα struct που αρχικοποιούν, μπορούν να αρχικοποιήσουν ακόμη και ιδιωτικά πεδία του structΓια να εμβαθύνεις σε αυτόν τον τύπο, μπορείς να δεις αυτούς τους πόρους: Go by Example: Structs, A Tour of Go: Structs ή Structures in Go (structs)
new
Ένας άλλος τρόπος για να δημιουργήσεις ένα νέο στιγμιότυπο ενός struct είναι να χρησιμοποιήσεις την ενσωματωμένη συνάρτηση new:
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
Σε αυτό το παράδειγμα, η new δημιουργεί ένα στιγμιότυπο του struct Shape με όλες τις τιμές αρχικοποιημένες στη μηδενική τιμή του τύπου τους και επιστρέφει έναν δείκτη σε αυτό.
Τις περισσότερες φορές, δεν θα δεις νέα στιγμιότυπα struct να δημιουργούνται με την ενσωματωμένη συνάρτηση new.
Προτίμησε πάντα ένα struct literal, μια προσαρμοσμένη συνάρτηση New ή οποιαδήποτε άλλη συνάρτηση παρέχει το πακέτο και μπορεί να σε βοηθήσει να φτιάξεις ένα struct.
Χρησιμοποίησε την ενσωματωμένη συνάρτηση new για να δημιουργήσεις νέα στιγμιότυπα struct μόνο ως έσχατη λύση.