Sobes.tech
Middle

Γιατί η κενή διεπαφή στο Go μπορεί να μετατραπεί σε οποιοδήποτε τύπο;

sobes.tech AI

Απάντηση από AI

Το κενό διασύνδεση interface{} δεν περιέχει μεθόδους. Οποιοσδήποτε τύπος στο Go μπορεί να ικανοποιήσει μια διασύνδεση που δεν απαιτεί μεθόδους. Επομένως, η τιμή οποιουδήποτε τύπου μπορεί να ανατεθεί σε μια μεταβλητή τύπου interface{} ή να περαστεί σε μια λειτουργία που δέχεται interface{}. Στην ουσία, το interface{} είναι ένας κοντέινερ για μια τιμή οποιουδήποτε τύπου, που αποθηκεύει τόσο την τιμή όσο και τον τύπο της.

package main

import "fmt"

func main() {
	var i interface{} // Δηλώνουμε μια μεταβλητή κενής διασύνδεσης

	i = 42            // Ανάθεση ενός int
	fmt.Printf("Αξία: %v, Τύπος: %T\n", i, i)

	i = "γεια"     // Ανάθεση ενός string
	fmt.Printf("Αξία: %v, Τύπος: %T\n", i, i)

	i = true        // Ανάθεση ενός bool
	fmt.Printf("Αξία: %v, Τύπος: %T\n", i, i)

	i = struct{}{}  // Ανάθεση μιας κενής δομής
	fmt.Printf("Αξία: %v, Τύπος: %T\n", i, i)
}

Η μετατροπή από interface{} σε συγκεκριμένο τύπο είναι δυνατή μέσω δήλωσης τύπου (type assertion) ή μέσω switch τύπου (type switch).

package main

import "fmt"

func main() {
	var i interface{} = "κόσμος"

	// Δήλωση τύπου
	s, ok := i.(string) // ελέγχει αν η τιμή είναι string
	if ok {
		fmt.Println("Επιτυχής δήλωση τύπου:", s)
	} else {
		fmt.Println("Αποτυχία δήλωσης τύπου")
	}

	// Switch τύπου
	switch v := i.(type) {
	case int:
		fmt.Println("Ο τύπος είναι int, τιμή:", v)
	case string:
		fmt.Println("Ο τύπος είναι string, τιμή:", v)
	default:
		fmt.Println("Άγνωστος τύπος")
	}
}