Dans Go, l'intégration permet aux types d'inclure des champs et des méthodes d'un autre type dans leur propre structure. Cependant, lorsque plusieurs types incorporés définissent une méthode portant le même nom (comme String()), certains scénarios peuvent conduire à un comportement inattendu.
Considérez le code suivant :
type Engineer struct { Person TaxPayer Specialization string } type Person struct { Name string Age int } func (p Person) String() string { return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age) } type TaxPayer struct { TaxBracket int } func (t TaxPayer) String() string { return fmt.Sprintf("%d", t.TaxBracket) } func main() { engineer := Engineer{ Person: Person{ Name: "John Doe", Age: 35, }, TaxPayer: TaxPayer{3}, Specialization: "Construction", } fmt.Println(engineer) }
Quand ce code est exécuté, il produit le résultat suivant :
{name: John Doe, age: 35 3 Construction}
Ce résultat peut sembler déroutant, car il existe plusieurs méthodes String() définies dans les types intégrés Person et TaxPayer. Cependant, l'ambiguïté est résolue par les règles suivantes :
La suppression de la méthode Person.String() ou de la méthode TaxPayer.String() résout l'ambiguïté, permettant à la méthode String() restante d'être utilisée pour le formatage par défaut.
Le point clé à retenir de ce comportement est que les types intégrés promeuvent leurs méthodes String() uniquement si une méthode unique et sans ambiguïté est définie. Si plusieurs méthodes existent, le type d'intégration n'a pas de méthode String() promue et le formatage par défaut est utilisé.
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!