当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/595377.html

相关文章:

  • TSN(时间敏感网络)协议栈在STM32平台(尤其是STM32MP2系列)上的实现
  • 设备虚拟化技术-IRF
  • C++ 中的默认构造函数:非必要,不提供
  • 苍穹外卖Day5
  • B树、B+树的区别及MySQL为何选择B+树
  • Git核心功能简要学习
  • GraphRAG快速入门和原理理解
  • 关于JVM
  • AXI接口学习
  • 上网行为管理-身份认证1
  • 剖析Sully.ai:革新医疗领域的AI助手功能启示
  • Hyperledger Fabric V2.5 生产环境部署及安装Java智能合约
  • 【OD机试】模拟数据序列号传输
  • 09_Spring Boot 整合 Freemarker 模板引擎的坑
  • 用简鹿视频格式转换器轻松制作 GIF 表情包教程
  • 牛客周赛 Round 101(题解的token计算, 76修地铁 ,76选数,76构造,qcjj寄快递,幂中幂plus)
  • 解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi
  • 元宇宙工厂漫游指南:VR可视化在设备巡检与远程运维中的沉浸式应用
  • zabbix企业级分布式监控
  • Java 实现 UDP 多发多收通信
  • C++unordered系列的map和set类(封装)
  • WAMP配置局域网https服务
  • C# 实现:动态规划解决 0/1 背包问题
  • Nacos 探活机制深度解析:临时 / 永久实例差异及与 Sentinel 的熔断协作
  • OpenAI API(1)补全Responses(Chat Completions)API和记忆Assistants API对比分析
  • Java 大视界 -- 基于 Java 的大数据分布式计算在地球物理勘探数据处理与地质结构建模中的应用(356)
  • 16 BTLO 蓝队靶场 Drill Down 解题记录
  • 前缀和题目:元素和小于等于阈值的正方形的最大边长
  • 计算机发展史:互联网时代的万物互联与全球变革
  • MySQL 17 如何正确地显示随机消息?