Golang 学习手册
  • 主页
  • 安装
  • 参考资料
  • Q&A
  • 基础
    • Hello,world!
    • 包
    • 变量
    • 常量
    • 类型
      • 整型
      • 浮点型
      • 复数
      • 布尔型
      • 字符
      • 字符串
      • 数组
      • 切片
      • 字典
      • 指针
      • 方法
      • 结构体
      • 接口
      • 自定义类型
    • 语法
      • 判断
      • 循环
      • 错误处理
    • 协程
      • 锁
      • 等待组
      • 通道
      • 上下文
    • 测试与分析
      • 单元测试
      • 性能测试
      • 性能分析
    • 编译
      • 条件编译
      • 交叉编译
  • 高级
    • 存储
      • 键值存储
        • Etcd
    • HTTP
      • http服务基础
      • Websocket
      • 开源框架
        • Beego
        • Echo
        • Gin
        • Iris
        • Revel
        • 框架对比
      • Kubernetes风格API框架
    • RPC
      • RPCX
      • GRPC
      • grpc-gateway
    • 连接分发器
    • TLS加密
    • 链路追踪
      • skywalking
  • 项目管理
    • 代码规范
    • 包管理
    • 文档
      • GoDoc
      • Markdown
      • Swagger
    • 仓库管理
      • 分支管理
      • 问题管理
      • 里程碑管理
      • 发布管理
    • 持续集成
      • CircleCI
      • TravisCI
由 GitBook 提供支持
在本页
  • 概念
  • 引用包
  • 别名引用
  • 匿名引用
  • 包初始化
  • 初始化引用
  • 可访问性
  • 包下载

这有帮助吗?

在Git上编辑
  1. 基础

包

概念

将项目根据代码的逻辑或结构进行拆分,形成包,关键字package。通常以目录为单位定义包,包名与目录名保持一致

例子:定义一个包

// 定义一个包a
package a

引用包

当一个包中需要用到另一个包中的内容时,可以对另一个包进行引用,关键字为import。进行包引用时需要指定被引用的包的路径,先是在$GOROOT/src路径下寻找,再当前项目中的vendor路径下寻找,最后到到$GOPATH/src路径下寻找

例子:在包a中引用包b

// 定义一个包a
package a

// 引用包b
import "b"

// 定义一个A方法,调用包b中的B方法
func A(){
    b.B()
}

当引用一个或多个包时,也可以用括号包起来

例子:在包a中引用多个包

// 定义一个包a
package a

// 引用包b和包c
import (
    "b"
    "c"
)

// 定义一个A方法,调用包b中的B方法和包c中的C方法
func A(){
    b.B()
    c.C()
}

别名引用

当包名出现重复时,可以为包定义一个别名,为包名定义别名后对于该引用包的调用全都改用别名

例子:为引用包定义别名

// 定义一个包A
package a

// 为引用包c/a定义一个别名pkgA
import (
     pkgA "c/a"
)

// 定义一个A方法,调用别名为pkgA的包c/a中的方法Test()
func A(){
    pkgA.Test()
}

匿名引用

当包名出现重复时,除了为引用的包定义别名外,还可以使用关键字.,对于引用包的调用无需再指定包名

例子:不指定引用包名

// 定义一个包A
package a

// 引用包c/a,并忽略其包名
import (
     . "c/a"
)

// 定义一个A方法,调用包c/a中的方法Test()
func A(){
    Test()
}

包初始化

在每个包中都可以定义一个init()方法,该方法通常用于做一些初始化工作。对于包进行引用时,首先会执行引用包中的init()方法。

例子:包的初始化

// 定义包a
package a

import (
    "fmt"
)

// 定义包初始化方法,在别的包引用到包a时,会首先执行该方法
func init() {
        fmt.Println("Initialize the package here")
}

初始化引用

如果只是需要执行引用包中的init方法,没有调用到其他内容时,可以使用关键字_

// 定义一个包A
package a

// 引用包c/a,只调用到其中的init()方法
import (
     _ "c/a"
)

在引用包后必须调用到引用包中的内容(使用了_关键字除外),否则会编译出错

使用关键字.引用包时,需要注意两个包中定义的内容没有重名

包的引用不能出现循环引用,以下用法是错误的:

  1. 包a引用了包b,包b引用包a

  2. 包a引用了包b,包b引用了包c,包c引用包a

可访问性

只有首字母为大写的内容才可以被别的包调用到

例子:可被其他包调用的内容

var Age int
const Name = 'Mike'
func Public() {
}

例子:不可被其他包调用的内容

var age int
const name = 'mike'
func private() {
}

包下载

一般情况下使用go get命令即可将包以及包所对应的依赖包都下载下来,而像是一些golang.org/x/下的包则需要连接到外网才能下载到。

例子:免翻墙下载golang.org/x/net包

git clone git@github.com:golang/net.git $GOPATH/src/golang.org/x/net

也可以通过环境变量GOPROXY设置包下载代理服务地址

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

可选的代理地址如下:

  • https://goproxy.io

  • https://goproxy.cn

上一页Hello,world!下一页变量

最后更新于5年前

这有帮助吗?

在没有翻墙手段的情况下,可以到github等代码仓库中找到对应的镜像包,如golang.org/x/net包在github中的镜像地址为,使用git命令将包下载到$GOPATH/src/golang.org/x/net目录下即可。

https://github.com/golang/net