Οι διεπαφές στη Go μπορούν να εισάγουν ασάφεια σχετικά με τον υποκείμενο τύπο.
Στην πραγματικότητα, η κενή διεπαφή μπορεί να πάρει οποιαδήποτε συγκεκριμένη τιμή (συμπεριλαμβανομένων των πρωτογενών τιμών).
Ένας ισχυρισμός τύπου μάς επιτρέπει να εξαγάγουμε την υποκείμενη συγκεκριμένη τιμή της τιμής της διεπαφής χρησιμοποιώντας αυτή τη σύνταξη: interfaceVariable.(concreteType).
Αν αναθέσουμε το αποτέλεσμα αυτής της εντολής σε μία μόνο τιμή, ισχυριζόμαστε ότι η μεταβλητή διεπαφής περιέχει μια τιμή του συγκεκριμένου τύπου. Ως αποτέλεσμα, μπορεί να προκαλέσει panic κατά την εκτέλεση αν η τιμή της διεπαφής δεν έχει τον καθορισμένο συγκεκριμένο τύπο. Για παράδειγμα:
var input interface{} = 12
str := input.(string) // panic at runtime since input is not a string!
Μπορούμε να ελέγξουμε αν μια τιμή διεπαφής περιέχει έναν συγκεκριμένο τύπο χρησιμοποιώντας και τις δύο τιμές επιστροφής του ισχυρισμού τύπου: την υποκείμενη τιμή και μια boolean (λογική τιμή) που αναφέρει αν ο ισχυρισμός πέτυχε. Για παράδειγμα:
str, ok := input.(string) // no panic if input is not a string
Αν το input περιέχει ένα string, τότε το str θα είναι η υποκείμενη τιμή και το ok θα είναι true.
Αν το input δεν περιέχει ένα string, τότε το str θα είναι η μηδενική τιμή του τύπου string (δηλ. "", η κενή συμβολοσειρά) και το ok θα είναι false.
Δεν προκαλείται panic σε καμία περίπτωση.
Είναι συνηθισμένο να βλέπεις αυτού του είδους τον ιδιωματισμό:
str, ok := input.(string)
if !ok {
str = "a default value"
}
Ένας διακόπτης τύπου μπορεί να εκτελέσει αρκετούς ισχυρισμούς τύπου στη σειρά.
Έχει την ίδια σύνταξη με έναν ισχυρισμό τύπου (interfaceVariable.(concreteType)), αλλά αντί για έναν συγκεκριμένο concreteType χρησιμοποιεί τη λέξη-κλειδί type.
Ακολουθεί ένα παράδειγμα:
var i interface{} = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}