Assertions de type dans Golang : suppression d'éléments des tranches d'interface
Dans Golang, les assertions de type nous permettent d'extraire le type sous-jacent d'une valeur d'interface . Cependant, après l'assertion de type, comment pouvons-nous manipuler la valeur sous-jacente ?
Considérons l'exemple suivant, qui tente de supprimer un élément d'une tranche d'interfaces dont le type est affirmé :
value := []interface{}{0, "one", "two", 3, 4} i := 2 value.([]interface{}) = append(value.([]interface{})[:i], value.([]interface{})[i+1:]...)
Le le code ci-dessus entraîne l'erreur "Impossible d'attribuer à la valeur ([]interface{})". Cette erreur vient du fait que les interfaces stockent une copie de la valeur sous-jacente et que les assertions de type ne modifient pas la valeur au sein de l'interface.
Solution
Pour modifier la valeur sous-jacente, nous devons plutôt stocker un pointeur vers la tranche dans l’interface. Par exemple :
var value interface{} = &[]interface{}{0, "one", "two", 3, 4}
Maintenant, nous pouvons déréférencer le pointeur et modifier la tranche comme suit :
sp := value.(*[]interface{}) i := 2 *sp = append((*sp)[:i], (*sp)[i+1:]...)
Sortie :
fmt.Println(value) // &[0 one 3 4]
Comme vous pouvez le voir , l'élément à l'index 2 ("deux") a été supprimé de la tranche. Cette approche modifie avec succès la valeur sous-jacente car l'interface stocke un pointeur vers la tranche, plutôt qu'une copie de la tranche elle-même.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!