golang函数返回接口指针

时间:2017-10-11 00:53:36

标签: pointers go syntax interface

有人可以帮助我理解为什么它没有使用[错误1]和[错误2]这样的语法吗?为什么[ok 1]是可能的并且工作得很好。

使用Animal作为字段作为通用类型的基本设计是好的吗?或者有什么坏事吗?或建议任何更好的解决方案?

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("---------------")
}

1 个答案:

答案 0 :(得分:3)

好的,有两件事:

  1. 您无法直接获取转化结果的地址,因为它不是可寻址的&#34;。有关详细信息,请参阅https://docs.microsoft.com/en-us/ef/core/modeling/generated-properties
  2. 你为什么要使用指向接口的指针?在我的所有项目中,我只使用过一次接口指针。接口指针基本上是指针的指针,有时需要,但非常罕见。内部接口是类型/指针对。因此,除非您需要修改接口值而不是值接口,否则您不需要指针。您可能会对section of the spec about the address-of operator感兴趣。