我在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
,但在这种情况下它有什么用途
答案 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接口。整齐