首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang解释组类型声明

Golang解释组类型声明
EN

Stack Overflow用户
提问于 2016-07-29 15:26:23
回答 3查看 1.7K关注 0票数 3

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

代码语言:javascript
复制
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库的例子

代码语言:javascript
复制
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
    }
)

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

代码语言:javascript
复制
var _ IRouter = &Engine{}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-29 16:08:32

密码

代码语言:javascript
复制
type (
   A int
   B string
)

功能是否与

代码语言:javascript
复制
type A int
type B string

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

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

票数 5
EN

Stack Overflow用户

发布于 2016-07-29 16:11:49

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

代码语言:javascript
复制
var _ IRouter = &Engine{}

创建*Engine实现IRouter接口的编译时检查。我们将*Engine类型的值赋值给一个必须是IRouter类型的变量。如果一个*Engine不满足接口,那么它就不会编译。

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

票数 4
EN

Stack Overflow用户

发布于 2016-07-30 06:34:01

关于第一个问题

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

TypeDecl =“TypeSpec "(”{ TypeSpec ";“}”))。TypeSpec =标识符类型。

从外行的角度来说,你可以:

类型

例如:

代码语言:javascript
复制
type Temperature uint8
type WeekTemp [7]Temperature

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

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

因此,您也可以等效地做:

代码语言:javascript
复制
type (
    Temperature unit8
    WeekTemp [7]Temperature
)

复合类型的另一个示例

代码语言:javascript
复制
type Tree struct {
    leftChild, rightChild *Tree
}

关于第二个问题,

编辑:我没有意识到这一点,但是在go操场上尝试,看起来来自jcbwlkr的答案确实是正确的。

所以试着编译

代码语言:javascript
复制
type MyInterface interface{
    someMethod() 
}
type MyType struct{}
var _ MyInterface = &MyType{}

会产生这个错误

不能将MyType文本(类型*MyType)用作赋值中的MyInterface类型:*MyType不实现MyInterface (缺少someMethod方法)

因此,它确实会进行编译时间检查,以确保引擎结构符合IRouter接口。整洁

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38662411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档