renderer是Go语言的一个简单的、轻量的、快速响应的呈现包,它可以支持JSON、JSONP、XML、HYAML、HTML、File等类型的响应。在开发web应用或RESTFul API的时候,这个包是非常方便的toolkit。
本文绕开如何使用它,深入到代码实现中研究它,同时也尝尝Go语言包的开发套路。
Go包基本结构体
package pkgname
import (
"fmt"
...
)
const (
CONST1 typeX = xx
...
)
var (
VAR1 typeX = xxx
...
)
func Fn1() {
}
在Go语言中包名和目录名保持一致,同一包内可共享命名空间。
- 包文件开头除了注释外,第一行,必须是package pkgname, 声明包的名称。
- 在包声明之后,可以import标准库中的包和其他外部包。
- 然后可以定义包常量、包变量(暴露变量和非暴露变量,以首字母大小写来区分实现)。
- 然后定义自定义类型、函数或方法。
import语句
import可以引入标准库的包,也可以引入外部包。Go语言中一旦引入某个包,必须在程序中使用到这个包的命名空间,否则编译报错会告诉你引入了某个包,但代码中未曾使用。
当然你也会有疑问,我如果需要引入包,但又不想使用怎么办。这个Go语言有一个特殊的符号"_", 放在引入包名前面,就可以防止编译报错。为什么会有这种考虑呢? 因为有时候,我们只是希望引入一个包,然后执行这个包的一些初始化设置。然后在代码中暂时不使用该包的任何方法和变量。
import (
_ "gitHub.com/xxxxx/pkgname"
)
上面语句会引入pkgname命名空间,但是暂时不在代码中使用这个命名空间。这样引入之后,会在pkgname包中寻找init()函数,然后在main()函数执行之前先执行它们,这点对于需要使用包之前做初始化非常有用。
暴露与非暴露的实现
我们在其他编程语言中,都接触过private, protected, public之类的修饰符。 但是在Go语言中完全没有这些,但是Go语言还是可以某些东西从包中暴露出去,而某些东西不暴露出去,它用的原则很简单的,就是标识符如果以小写字母开头的,包外不可见; 而如果是标识符以大写字符开头的,包外可见,可访问。
对于暴露变量和函数(方法)非常直观简单,但是如果是暴露的结构体,情况稍微复杂一点。 不过本质上也是差不多, 结构体外部如果小写字母开头,内部属性大写字母开头。 则外部包直接不访问,但如果通过函数或方法返回这个外部类型,那么可以通过:=得到这个外部类型,从而可以访问其内部属性。举例如下:
// package pkgname
package pkgname
type admin struct {
Name string
Email String
}
func Admin() *admin {
return &admin{
Name: "admin",
Email: "admin@email.com",
}
}
那么我们在外部包中,可以直接通过下面代码访问admin结构体内部的属性:
admin := pkgname.Admin()
fmt.Println(admin.Name, admin.Email)
当然这种情况下,需要你事先知道admin的结构以及包含的属性名。
有疑问加站长微信联系(非本文作者)