go语言包管理和变量保护

文章目录

go语言教程:

包、模块、工作空间

每个Go语言程序,都以package xxx 开头,即申明本文件定义的所有函数、结构体,均从属于xxx包。当项目文件较多时,这种管理方式是所有编程语言的必然选择。相应地,通过import来调用包也是情理之中了,但低版本的Go语言很坑,并不支持import相对路径,故而本文对导入包的介绍,只在1.18以上的Go语言版本中有效。

为了让案例足够简单,可按照如下目录结构创建相应的文件,其中hello.go文件设置了一个自定义函数,我们希望main.go文件对其进行引用

go 复制代码
demo
│  go.work
│
├─main
│      go.mod
│      main.go
│
└─tools
        go.mod
        hello.go

其中,go.work为工作空间文件,use是工作空间中用到的库,其作用可以理解为将相对路径添加到环境变量,从而让go语言引用。

go 复制代码
//go.work
use (
	./tools
	./main
)

tools文件夹中有两个文件,hello.go就是一个简单的go包,内容如下,无需多言。

go 复制代码
//tools/hello.go
package tools

func Hello() string {
	return "Hello world"
}

go.mod则是一个模块文件,用以声明模块名,当其他文件引用hello.go中的函数时,需要用到这个名字。

go 复制代码
//tools/go.mod
module microcold/tools

main文件夹中的内容与tools如出一辙,go.mod和main.go文件分别如下

go 复制代码
//main/go.mod
module microcold/main
go 复制代码
//main/main.go
package main

import (
	"fmt"
	"microcold/tools"
)

func main() {
	fmt.Println(tools.Hello())
}

最后在demo文件夹下运行go run指令,即可得到正确结果。

go 复制代码
>go run microcold/main
Hello world

变量保护

所谓封装,并不仅仅是把一些变量和功能塞给一个类,关键还需要有变量保护。在Go语言中,结构体成员如果以大写字母开头,则允许包外访问,如果以小写字母开头,则不允许。

比如,将hello.go中的Hello函数改为小写的hello,则编译时会报如下错误

go 复制代码
main\main.go:9:20: undefined: tools.Hello

结构体的命名同样遵循这个要求,下面在tools文件夹中新建一个note.go文件,内容为

go 复制代码
package tools

type Note struct{
	Title string
	Author string
	Pages int
	Words int
}

func (n *Note) GetWordsPP() int {
    return n.Words / n.Pages
}

然后改写main函数

go 复制代码
// main.go。。。前面不用改

func main(){
	n := tools.Note{"GoLearning", "microCold", 200, 250000}
	fmt.Println("标题:", n.Title)
	fmt.Println("每页字数:", n.GetWordsPP())
}

运行结果为

go 复制代码
>go run microcold/main
标题: GoLearning
每页字数: 1250

如果将Note结构体中的Author改为小写的author,尽管这个成员没有被显式地调用,但编译过程仍会报错

go 复制代码
>go run microcold/main
# microcold/main
main\main.go:9:32: implicit assignment to unexported field author in tools.Note literal
相关推荐
圣殿骑士-Khtangc4 小时前
Go-Map面试核心考点从哈希冲突到并发安全的完整解析
面试·golang·哈希算法
worxfr4 小时前
Go 并发控制:从 Channel 方向约束到实战模式
开发语言·后端·golang
xcLeigh5 小时前
Go入门:短变量声明的陷阱与最佳实践
java·redis·golang·教程·变量
JavaPub-rodert6 小时前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
名字还没想好☜6 小时前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
圣殿骑士-Khtangc8 小时前
Go-Select多路复用机制的面试真题与底层实现
开发语言·面试·golang
啊哈一半醒1 天前
Go 语言 Context 全方位详解:原理、实战与避坑
开发语言·后端·golang
名字还没想好☜1 天前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
ttwuai1 天前
Go 后台定时任务启停不生效怎么办?先查调度同步链路
开发语言·后端·golang