4.1 Go语言中包(Packages)基础知识
Posted 孙琦Ray
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.1 Go语言中包(Packages)基础知识相关的知识,希望对你有一定的参考价值。
基本概念
- 包是函数和数据的集合
- 使用package关键字进行定义
- 文件名可以不完全与包名相同
- 包名通常使用小写字母定义
- 包里可以有很多文件,但是他们共享同一个包名
- 通过函数名称的大小写区分私有还是可被外部使用的
- 大写,可以被外部使用(exported)
- 小写,私有函数(private)
- 请注意,“大写”一词不仅限于 US-ASCII——它还扩展到所有双字字母(拉丁文、希腊文、西里尔文、亚美尼亚文和科普特文)
示例:公有和私有函数及Go中包管理方式
代码及结构
先看一下目录结构,注意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package,暂未查询是否有方法不按照src查询
├── main.go
└── src
└── myfunc
└── myfunc.go
package main
import "myfunc"
func main()
myfunc.MyPublicFunc()
// NOTE(Ray): Can not call private function
//myfunc.myPrivateFunc()
根据上面的描述,Go语言中通过包中函数的名称来区分公共函数和私有函数,我们在main函数中是无法调用myPrivateFunc的
package myfunc
import "fmt"
func MyPublicFunc()
fmt.Println("Use my public function.")
// NOTE(Ray): This is private function, can not be used outside
func myPrivateFunc()
fmt.Println("Use my public function.")
此时如果执行通过go run方式执行,会看到如下的提示信息,这与大部分语言对于包管理方式相关,所以我们通过两种不同的方法来让代码执行起来
main.go:3:8: package myfunc is not in GOROOT (/usr/local/go/src/myfunc)
通过设置GOPATH执行
go env
返回如下,这里面对我们后续执行有影响的两个参数GO111MODULE和GOPATH
- GO111MODULE是在Go 1.11引入的Go模块,需要搭配go.mod使用
- GOPATH则是Go语言中旧的依赖管理模式,该模式下无法对依赖的版本进行控制
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/root/workspace/go/test_package/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH=""
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.6"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3817126445=/tmp/go-build -gno-record-gcc-switches"
如果要使用gopath模式引用包,则需要关闭mod模式
export GO111MODULE=off
设置GOPATH为当前路径,即main.go所在的路径
go env -w GOPATH=$(pwd)
此时再查看go env时,GOPATH已经发生改变
GOPATH="/root/workspace/go/test_package"
我们再次尝试执行代码
go run main.go
可以看到public函数被调用
Use my public function.
以上是关于4.1 Go语言中包(Packages)基础知识的主要内容,如果未能解决你的问题,请参考以下文章