我在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
)我不明白的是,这个分组在做什么,这个实现的目的是什么(除非我错过了这个主题,否则文档中没有太多的内容)。
另一个来自gin库的例子
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,但在这种情况下它有什么用途?
发布于 2016-07-29 16:08:32
密码
type (
A int
B string
)功能是否与
type A int
type B string分组只是组织代码的一种方式。有时,分组用于表示类型在某种程度上是相关的。
空白标识符的使用在Specs: What's the purpose of the blank identifier in variable assignment?中解释。
发布于 2016-07-29 16:11:49
我想你问题的第一部分已经回答了。至于第二部分,
var _ IRouter = &Engine{}创建*Engine实现IRouter接口的编译时检查。我们将*Engine类型的值赋值给一个必须是IRouter类型的变量。如果一个*Engine不满足接口,那么它就不会编译。
这并不是绝对必要的,但有些人喜欢把它放在定义类型的地方,以确保它始终满足预期的接口。
发布于 2016-07-30 06:34:01
关于第一个问题
显示的状态是Go语言规范中的类型声明:类型声明将标识符类型名称绑定到具有与现有类型相同的基础类型的新类型,并且为现有类型定义的操作也为新类型定义。新类型与现有类型不同。
TypeDecl =“TypeSpec "(”{ TypeSpec ";“}”))。TypeSpec =标识符类型。
从外行的角度来说,你可以:
类型
例如:
type Temperature uint8
type WeekTemp [7]Temperature对于基础类型,布尔类型、数值类型和字符串类型的命名实例都是预先声明的。组合类型使用类型文本构造。
TypeLiteral = ArrayType、StructType、PointerType、FunctionType、FunctionType、InterfaceType、SliceType、MapType、MapType、ChannelType。
因此,您也可以等效地做:
type (
Temperature unit8
WeekTemp [7]Temperature
)复合类型的另一个示例
type Tree struct {
leftChild, rightChild *Tree
}关于第二个问题,
编辑:我没有意识到这一点,但是在go操场上尝试,看起来来自jcbwlkr的答案确实是正确的。
所以试着编译
type MyInterface interface{
someMethod()
}
type MyType struct{}
var _ MyInterface = &MyType{}会产生这个错误
不能将MyType文本(类型*MyType)用作赋值中的MyInterface类型:*MyType不实现MyInterface (缺少someMethod方法)
因此,它确实会进行编译时间检查,以确保引擎结构符合IRouter接口。整洁
https://stackoverflow.com/questions/38662411
复制相似问题