2

我在 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但在那种情况下它有什么目的

4

3 回答 3

5

编码

type (
   A int
   B string
)

功能是否等同于

type A int
type B string

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

Specs中解释了空白标识符的使用:变量赋值中空白标识符的目的是什么?.

于 2016-07-29T16:08:32.490 回答
4

我想你的问题的第一部分已经回答了。至于第二部分,代码

var _ IRouter = &Engine{}

创建*Engine实现IRouter接口的编译时检查。我们将 type 的值分配给*Engine必须是 type 的变量IRouter。如果 a*Engine不满足接口,则它不会编译。

这不是绝对必要的,但有些人喜欢将它放在他们定义类型的地方,以确保它始终满足预期的接口。

于 2016-07-29T16:11:49.423 回答
0

关于第一个问题

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

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

用外行的话,你可以这样做:

类型

例如

type Temperature uint8
type WeekTemp [7]Temperature

对于基础类型,预先声明了布尔、数字和字符串类型的命名实例。复合类型是使用类型文字构造的

TypeLiteral = ArrayType | 结构类型 | 指针类型 | 函数类型 | 接口类型 | 切片类型 | 地图类型 | 频道类型。

所以你也可以等效地做:

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 接口。整洁的

于 2016-07-30T06:34:01.687 回答