Go语言的包
自定义包 -- 自己写的
内置包 --fmt strings os bufio json
第三方包 -- 别人写好的,需要去下载的
1.go语言模块文件的顶部,声明这是哪个包
2.每个程序 必须包含一个main包,main包中要有main函数,程序入口就是main函数
3.go语言一个目录下放一个包,一个包可以有不同的文件,目录的名字可以跟包名不一样
4.导入了包,就一定要使用这个包
5.包中标识符首字母大写表示公有成员(可以给外部调用) 首字母没有大写表示私有成员,只能在包中调用
go命令:
go env #查看go环境
需要关注的环境有:
GO111MODULE='' //指定go项目的包管理方式
GOPATH='/Users/zhuhongye/go' //go的包管理路径
GOPROXY='https://proxy.golang.org,direct' //指定下载第三方包代理
GOROOT='/usr/local/go' //go的安装路径 GOROOT/src 下面放置内置包
#修改go环境变量
#修改go环境变量,修改GOPROXY 指定国内代理网址 //七牛云的
go env -w GOPROXY=https://goproxy.cn,direct
go项目包管理方式:
1.gopath
早期go项目环境是看gopath的设置,项目都要放在$GOPATH/src目录下,下载的第三方包也放在$GOPATH/pkg目录下
这种管理会造成多个项目混用,管理起来不方便,也不好控制版本
2.go vender
项目还是放在$GOPATH目录下面,引入了一个vendor可以进行不同项目的版本管理
3.go mod
a、项目工程目录可以放在GOPATH路径之外
b、要求项目中必须要有go.mod文件,go.mod文件记录当前项目需要的第三方软件以及它的版本
c、所有第三方依赖包都放在$GOPATH/pkg/mod 目录下
#开启go mod方式管理包
go env -w GO111MODULE=on
go mod 命令:
go mod init xxxx 使用go mod 方式管理项目,初始化项目xxx xxx的名字为项目包名
go mod tidy 当前项目缺少哪些包,自动安装
手动一个个安装包
go get github.com/gin-gonic/gin
go -- gin框架 做web开发
init函数 包初始化函数,导入包的时候自动执行init函数
init函数用于包执行之前做初始化工作
每个包可以拥有多个init函数
同一个包中init函数顺序执行
不同包中init函数按照包的导入依赖关系决定init的执行顺序
init函数不能被其他函数调用
开启go mod之后,包的查找顺序:
先在项目目录下找
然后去$GOPATH/pak/mod目录下查找相应的版本进行导入
如果还没有找到,再去$GOPATH/src下查找
最后去$GOROOT/src目录查找
package mainimport ("github.com/gin-gonic/gin"
)func main() {//生成gin实例g := gin.Default()//添加路由g.GET("/", func(c *gin.Context) {c.String(200, "hello,gin!")})//启动gin实例,绑定到本机8000端口g.Run(":8000")
}
apiproj
apiproj/
├── student
│ ├── stu1.go
│ └── stu2.go
├── teacher/
│ └── teacher.go
├── go.mod
└── main.go
stu1.go
package mystudent //包名可以和目录名不一样import "fmt"var stuname string = "sc" //同一个包下面,不同文件中的函数、变量可以随便调用//stuname 识别成私有成员,只能在包内使用,别的包不能调用
//标识符在包中,如果首字母小写,识别成私有成员,只能在包中使用
// 如果首字母大写,识别成公有成员,可以在其他包中使用var Stuage int = 20func init() {fmt.Println("this is student init...")
}
stu2.go
package mystudentimport "fmt"func StuInfo() {fmt.Println("this is stu2.go,function stuinfo")fmt.Println(stuname)
}
teacher.go
package teacherimport "fmt"func init() {//名字就叫initfmt.Println("这是包中的一个特殊函数,init")/*这个函数在导入包的时候自动执行一般用于做一些初始化工作*/
}func init() {fmt.Println("init .. 2")
}func TeacherInfo() {fmt.Println("this is teacher info")
}
go.mod
module apiprojgo 1.24.3
main.go
package mainimport (//"apiproj/student " //包名和目录名一致时mystudent "apiproj/student" //包名和目录名不一样时//t "apiproj/teacher" //为导入的teacher包取别名 t 使用--》t.TeacherInfo()//. "apiproj/teacher" //导入teacher包的所有东西 使用--》TeacherInfo()_ "apiproj/teacher" //匿名导入,导入之后可以不使用,只需要执行包中的init函数"fmt"
)func main() {fmt.Println("这是main包,main函数")mystudent.StuInfo()//fmt.Println(mystudent.stuname)//不能访问其他包的私有成员fmt.Println(mystudent.Stuage)//t.TeacherInfo()//TeacherInfo() //前面是导入teacher包中所有内容,那直接调用teacher包中的函数即可
}
apiserver
apiserver/
├── handler
│ └── handler.go
├── router/
│ └── router.go
├── go.mod
└── main.go
handler.go
package handlerimport ("github.com/gin-gonic/gin"
)func Handler_test(c *gin.Context) {//一系列的处理操作c.String(200, "this is handler_test")
}
router.go
package routerimport ("scapi/handler""github.com/gin-gonic/gin"
)func Load(g *gin.Engine) {g.GET("/login", func(c *gin.Context) {c.String(200, "this is login!")})g.GET("/register", func(c *gin.Context) {c.String(200, "this is register!")})g.GET("/hander", handler.Handler_test)
}
main.go
// package main// import (
// "scapi/router"// "github.com/gin-gonic/gin"
// )// func main() {
// //生成gin实例
// g := gin.Default()
// //添加路由
// g.GET("/", func(c *gin.Context) {
// c.String(200, "hello,gin!")
// })
// router.Load(g)
// //启动gin实例,绑定到本机8000端口
// g.Run(":8000")
// }package mainimport ("flag""scapi/router""github.com/gin-gonic/gin"
)func main() {// 定义命令行参数,默认端口为8000port := flag.String("port", "8000", "端口号")//解析命令行参数flag.Parse()// 生成gin实例g := gin.Default()// 添加路由g.GET("/", func(c *gin.Context) {c.String(200, "hello,gin!")})router.Load(g)// 启动gin实例,绑定到指定端口g.Run(":" + *port)
}//命令行敲 go run main.go -port=9000