Διαδρομές
/
Go
Go
/
Ύλη
/
Συναρτήσεις
Συ

Συναρτήσεις σε Go

1 άσκηση

Σχετικά με την έννοια Συναρτήσεις

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

Παράμετροι συνάρτησης

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

import "fmt"

// No parameters
func PrintHello() {
    fmt.Println("Hello")
}

// One parameter
func PrintHelloName(name string) {
  fmt.Println("Hello " + name)
}

Παράμετροι του ίδιου τύπου μπορούν να δηλωθούν μαζί, ακολουθούμενες από μία μόνο δήλωση τύπου.

import "fmt"

func PrintGreetingName(greeting, name string) {
  fmt.Println(greeting + " " + name)
}

Παράμετροι έναντι ορισμάτων

Ας δούμε γρήγορα δύο όρους που συχνά μπερδεύονται μεταξύ τους: τις parameters και τα arguments. Οι παράμετροι μιας συνάρτησης είναι τα ονόματα που ορίζονται στην υπογραφή της, όπως τα greeting και name στη συνάρτηση PrintGreetingName παραπάνω. Τα ορίσματα μιας συνάρτησης είναι οι συγκεκριμένες τιμές που περνιούνται στις παραμέτρους της όταν καλούμε τη συνάρτηση. Για παράδειγμα, στο παρακάτω παράδειγμα, τα "Hello" και "Katrina" είναι τα ορίσματα που περνιούνται στις παραμέτρους greeting και name:

PrintGreetingName("Hello", "Katrina")

Τιμές επιστροφής

Μετά τις παραμέτρους της συνάρτησης ακολουθούν μηδέν ή περισσότερες τιμές επιστροφής, οι οποίες επίσης πρέπει να έχουν ρητά δηλωμένο τύπο. Οι μεμονωμένες τιμές επιστροφής αφήνονται γυμνές, ενώ οι πολλαπλές τιμές επιστροφής περικλείονται σε παρένθεση. Οι τιμές επιστρέφονται στον κώδικα που κάλεσε τη συνάρτηση με τη λέξη-κλειδί return. Μπορεί να υπάρχουν πολλές εντολές return μέσα σε μια συνάρτηση. Η εκτέλεση της συνάρτησης τελειώνει μόλις συναντήσει μία από αυτές τις εντολές return. Αν μια συνάρτηση πρέπει να επιστρέψει πολλαπλές τιμές, αυτές χωρίζονται με κόμμα. Περισσότερες πληροφορίες για τη σωστή χρήση των πολλαπλών τιμών επιστροφής μπορείς να βρεις στη συνδεδεμένη έννοια.

func Hello(name string) string {
  return "Hello " + name
}

func HelloAndGoodbye(name string) (string, string) {
  return "Hello " + name, "Goodbye " + name
}

Κλήση συναρτήσεων

Η κλήση μιας συνάρτησης γίνεται γράφοντας το όνομα της συνάρτησης και περνώντας ορίσματα για κάθε παράμετρο της συνάρτησης μέσα σε παρενθέσεις.

import "fmt"

// No parameters, no return value
func PrintHello() {
    fmt.Println("Hello")
}
// Called like this:
PrintHello()

// One parameter, one return value
func Hello(name string) string {
  return "Hello " + name
}
// Called like this:
greeting := Hello("Dave")

// Multiple parameters, multiple return values
func SumAndMultiply(a, b int) (int, int) {
    return a+b, a*b
}
// Called like this:
aplusb, atimesb := SumAndMultiply(a, b)

Ονομασμένες τιμές επιστροφής και γυμνή επιστροφή

Όπως και οι παράμετροι, έτσι και οι τιμές επιστροφής μπορούν προαιρετικά να έχουν όνομα. Αν χρησιμοποιηθούν ονομασμένες τιμές επιστροφής, μια εντολή return χωρίς ορίσματα θα επιστρέψει αυτές τις τιμές. Αυτό είναι γνωστό ως "γυμνή" επιστροφή.

func SumAndMultiplyThenMinus(a, b, c int) (sum, mult int) {
    sum, mult = a+b, a*b
    sum -= c
    mult -= c
    return
}

Πέρασμα με τιμή έναντι περάσματος με αναφορά

Είναι επίσης σημαντικό να ξεκαθαρίσουμε την έννοια του περάσματος με τιμή και του περάσματος με αναφορά.

Πρώτα, ας ξεκαθαρίσουμε το πέρασμα με τιμή. Στο παρακάτω παράδειγμα, όταν περνάμε τη μεταβλητή val στη συνάρτηση MultiplyByTwo, περνάμε ένα αντίγραφο της val. Εξαιτίας αυτού, η newVal έχει την ενημερωμένη τιμή 4, αλλά η αρχική μεταβλητή val παραμένει 2. Στο παρασκήνιο, η Go ουσιαστικά φτιάχνει ένα αντίγραφο της αρχικής τιμής, ώστε μόνο αυτό το αντίγραφο, γνωστό και ως v, να τροποποιείται από τη συνάρτηση.

val := 2
func MultiplyByTwo(v int) int {
    v = v * 2
    return v
}
newVal := MultiplyByTwo(val)
// newval is 4, val is still 2 because only a copy of its value was passed into the function

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

Δείκτες

Χρησιμοποιούμε έναν pointer για να πετύχουμε το πέρασμα με αναφορά. Περνώντας pointer ορίσματα σε μια συνάρτηση, μπορούμε να τροποποιήσουμε τα δεδομένα που περνιούνται στη συνάρτηση αντί να δουλεύουμε μόνο σε ένα αντίγραφό τους.

Για την ώρα, αρκεί να ξέρεις ότι οι τύποι δεικτών ξεχωρίζουν από το * μπροστά από τον τύπο στην υπογραφή της συνάρτησης.

func HandlePointers(x, y *int) {
    // Some logic to handle integer values referenced by pointers x and y
}

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

Εξαιρέσεις

Σημείωσε ότι τα slices και τα maps αποτελούν εξαιρέσεις στον παραπάνω κανόνα. Όταν περνάμε ένα slice ή ένα map ως ορίσματα σε μια συνάρτηση, αντιμετωπίζονται ως τύποι δεικτών, ακόμα κι αν δεν υπάρχει ρητό * στον τύπο. Αυτό σημαίνει ότι αν περάσουμε ένα slice ή map σε μια συνάρτηση και τροποποιήσουμε τα δεδομένα του, οι αλλαγές θα φανούν στο αρχικό slice ή map.

Άλλοι τύποι συναρτήσεων

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

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Συναρτήσεις