go语言renderer包代码分析

WalkerQiao · · 1721 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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的结构以及包含的属性名。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:WalkerQiao

查看原文:go语言renderer包代码分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1721 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传