Golang godoc - 解释组类型声明

时间:2016-07-29 15:26:24

标签: go data-structures godoc

我在GIN库和Google文档中看到过一段GO代码,如下所示

type (
    T0 []string
    T1 []string
    T2 struct{ a, b int }
    T3 struct{ a, c int }
    T4 func(int, float64) *T0
    T5 func(x int, y float64) *[]string
)

我不明白的是,这个分组正在做什么以及这个实现的目的是什么(除非我错过了,否则在这个主题的文档中没有太多内容)

来自杜松子酒图书馆的另一个例子

type (
    RoutesInfo []RouteInfo
    RouteInfo  struct {
        Method  string
        Path    string
        Handler string
    }
        Engine struct {
        RouterGroup
        HTMLRender  render.HTMLRender
        allNoRoute  HandlersChain
        allNoMethod HandlersChain
        noRoute     HandlersChain
        noMethod    HandlersChain
        pool        sync.Pool
        trees       methodTrees

        RedirectTrailingSlash bool


        RedirectFixedPath bool      
        HandleMethodNotAllowed bool
        ForwardedByClientIP    bool
    }
)

最后 - 对不起,这是与此相关的不同主题

var _ IRouter = &Engine{}

为什么有一个_面向IRouter?我知道它是blank identifier,但在这种情况下它有什么用途

3 个答案:

答案 0 :(得分:3)

代码

type (
   A int
   B string
)

功能与

相同
type A int
type B string

分组只是组织代码的一种方式。分组有时用于表示类型以某种方式相关。

Specs: What's the purpose of the blank identifier in variable assignment?中解释了空白标识符的使用。

答案 1 :(得分:1)

我认为问题的第一部分已经得到了解答。至于第二部分,代码

var _ IRouter = &Engine{}

创建*Engine实现IRouter接口的编译时检查。我们将类型*Engine的值分配给必须属于IRouter类型的变量。如果*Engine不满足接口,那么它将无法编译。

这不是绝对必要的,但有些人喜欢将它放在定义类型的位置,以确保它始终满足预期的界面。

答案 2 :(得分:0)

关于第一个问题

显示的陈述是类型声明 来自Go语言规范: 类型声明将标识符(类型名称)绑定到与现有类型具有相同基础类型的新类型,并且还为新类型定义为现有类型定义的操作。新类型与现有类型不同。

  

TypeDecl =" type" (TypeSpec |"(" {TypeSpec&#34 ;;"}")")。   TypeSpec =标识符类型。

通俗地说,你可以这样做:

  

输入

e.g。

type Temperature uint8
type WeekTemp [7]Temperature

对于底层类型,  预先声明了布尔,数字和字符串类型的命名实例。  使用类型文字

构造复合类型
  

TypeLiteral = ArrayType | StructType | PointerType | FunctionType |   InterfaceType |         SliceType | MapType | ChannelType。

所以你也可以等同地做:

type (
    Temperature unit8
    WeekTemp [7]Temperature
)

复合类型的另一个例子

type Tree struct {
    leftChild, rightChild *Tree
}

第二个问题,

编辑: 我没有意识到这一点,但试着去游乐场,看起来jcbwlkr的答案确实是对的。

所以试图编译

type MyInterface interface{
    someMethod() 
}
type MyType struct{}
var _ MyInterface = &MyType{}

会出现此错误

  

不能使用MyType文字(类型* MyType)作为MyInterface类型   赋值:* MyType没有实现MyInterface(缺少   someMethod方法)

所以它确实进行了编译时检查以确保Engine结构符合IRouter接口。整齐