初次接触Golang,在阅读Iris源码的时候,有2处看不懂,特来请教一下:
1)在文件go19.go中,看到type有如下的用法:
type (
Context = context.Context
UnmarshalerFunc = context.UnmarshalerFunc
Map = context.Map
......
)
这个是Type的什么用法呢?直接在VSCode测试,发现会有编译错误,是否这样写是有前提的?
2)在example的overview目录中,有如下的一段代码:
func main() {
app := iris.New()
// app.Logger().SetLevel("disable") to disable the logger
// Define templates using the std html/template engine.
// Parse and load all files inside "./views" folder with ".html" file extension.
// Reload the templates on each request (development mode).
app.RegisterView(iris.HTML("./views", ".html").Reload(true))
// Register custom handler for specific http errors.
app.OnErrorCode(iris.StatusInternalServerError, func(ctx iris.Context) {
// .Values are used to communicate between handlers, middleware.
errMessage := ctx.Values().GetString("error")
if errMessage != "" {
ctx.Writef("Internal server error: %s", errMessage)
return
}
ctx.Writef("(Unexpected) internal server error")
})
app.Use(func(ctx iris.Context) {
ctx.Application().Logger().Infof("Begin request for path: %s", ctx.Path())
ctx.Next()
})
..................}
疑惑之处:OnErrorCode 这个函数在Application中并不能找到,而是在APIBuilder中发现有,但是这2个不是一个struct,能这样调用吗?希望不吝赐教
1. type的用法,是Go 1.9 的类型别名,详细使用可以看这个 https://colobu.com/2017/06/26/learn-go-type-aliases/
2. OnErrorCode这个函数在Application中并不能找到,但可以使用的原因是:
Application这个类型通过组合(mixin)获得了APIBuilder的方法,可以去看一下Application这个struct的定义
```go
type Application struct {
// routing embedded | exposing APIBuilder's and Router's public API.
*router.APIBuilder
*router.Router
......
}
```
#1
更多评论
<a href="/user/chenph" title="@chenph">@chenph</a> 非常感谢回复。
对第二个问题重新理解如下:每个struct结构体相当于一个家庭,成员变量类似于家庭中的每一个成员,当某个成员的函数是家庭内部独一无二的时候,则可以不用指明成员函数,直接由家长来调用,认为是家长的方法。
这样可以使得代码非常的简洁。
#2