2017-10-11 14 views
1

Quelqu'un peut-il m'aider à comprendre pourquoi il n'utilise pas la syntaxe comme [Erreur 1] et [Erreur 2] ?, pourquoi [ok 1] est possible et fonctionne très bien.golang function return inteface pointeur

La conception de base est-elle d'utiliser Animal comme champ pour servir de type générique? ou quelque chose de mal à ce sujet? ou une meilleure solution suggérée?

package main 

import (
    pp "github.com/davecgh/go-spew/spew" 
) 

type Cat struct { 
    Name string 
    Age int 
} 

type Animal interface{} 

type House struct { 
    Name string 
    Pet *Animal 
} 

func config() *Animal { 

    c := Cat{"miao miao", 12} 
    // return &Animal(c) //fail to take address directly  [Error 1] 
    // return &(Animal(c)) //fail to take address directly  [Error 2] 
    a := Animal(c)  //[Ok 1] 
    return &a 
} 

func main() { 
    pp.Dump(config()) 
    pp.Dump(*config()) 
    pp.Dump((*config()).(Cat)) //<-------- we want this 
    pp.Dump((*config()).(Cat).Name) 
    pp.Dump("---------------") 
    cfg := config() 
    pp.Dump(&cfg) 
    pp.Dump(*cfg) 
    pp.Dump((*cfg).(Cat)) //<-------- we want this 
    pp.Dump((*cfg).(Cat).Name) 
    pp.Dump("---------------") 
} 

Répondre

3

Ok, deux choses:

  1. Vous ne pouvez pas prendre l'adresse du résultat d'une conversion directement, comme il est « adressable ». Voir le section of the spec about the address-of operator pour plus d'informations.
  2. Pourquoi utilisez-vous un pointeur sur une interface? Dans tous mes projets, j'ai seulement utilisé un pointeur d'interface. Un pointeur d'interface est essentiellement un pointeur vers un pointeur, parfois nécessaire, mais très rare. Les interfaces internes sont une paire type/pointeur. Donc, sauf si vous avez besoin de modifier la valeur d'interface au lieu de la valeur l'interface contient alors vous n'avez pas besoin d'un pointeur. This post peut être d'intérêt pour vous.