个人网站与企业网站区别嘉兴网站建设哪家做得好
个人网站与企业网站区别,嘉兴网站建设哪家做得好,在建设银行网站上能看到自己贷款么,在线crm平台1. 包的基本概念
Go 中的包是代码组织和复用的基本单位。每个 Go 文件都属于一个包。
2. 包的声明
// 每个 Go 文件的第一行都必须声明所属的包
package main // 可执行程序必须使用 main 包package math // 普通包通常使用小写命名
package utils // 包名应该简洁且有意义3.…1. 包的基本概念Go 中的包是代码组织和复用的基本单位。每个 Go 文件都属于一个包。2. 包的声明// 每个 Go 文件的第一行都必须声明所属的包packagemain// 可执行程序必须使用 main 包packagemath// 普通包通常使用小写命名packageutils// 包名应该简洁且有意义3. main 包// main.gopackagemainimport(fmt)// main 函数是程序的入口funcmain(){fmt.Println(程序从这里开始执行)}4. 创建和使用自定义包目录结构project/ ├── main.go ├── go.mod └── calculator/ └── calculator.go初始化模块go mod init myproject创建自定义包// calculator/calculator.gopackagecalculator// 首字母大写的函数、类型、变量可以被外部访问公开funcAdd(a,bint)int{returnab}funcSubtract(a,bint)int{returna-b}// 首字母小写的只能在包内部使用私有funcmultiply(a,bint)int{returna*b}// 包级别的变量varVersion1.0.0varinternalVersioninternal-1.0.0使用自定义包// main.gopackagemainimport(fmtmyproject/calculator// 从模块根目录开始的路径)funcmain(){sum:calculator.Add(10,5)fmt.Printf(Sum: %d\n,sum)fmt.Printf(Version: %s\n,calculator.Version)// 下面的会报错因为未导出// calculator.multiply(2, 3)// fmt.Println(calculator.internalVersion)}5. 包的导入基础导入importfmtimportmathimportstrings分组导入import(fmtmathstringsmyproject/calculatorgithub.com/gin-gonic/gin// 第三方包)别名导入import(ffmt// 给包起别名calcmyproject/calculatormath.strings// 点导入不推荐容易造成命名冲突)funcmain(){f.Println(calc.Add(1,2))// 使用别名Contains(hello,h)// 点导入后可以直接使用函数名}空白导入import_image/png// 仅执行包的 init 函数不使用其导出内容import_github.com/go-sql-driver/mysql// 常见于注册数据库驱动6. init 函数// config/config.gopackageconfigimportfmt// 包级别的变量varAppNamestringvarAppVersionstring// init 函数在包初始化时自动执行funcinit(){fmt.Println(config 包 init 函数执行)AppNameMyAppAppVersion1.0.0}// 可以有多个 init 函数按声明顺序执行funcinit(){fmt.Println(第二个 init 函数)// 其他初始化操作}7. 包的初始化顺序// a.gopackagemainimportfmt// 1. 首先初始化包级别的变量varGlobalVarinitVar()funcinitVar()string{fmt.Println(初始化变量)returnglobal}// 2. 然后执行 init 函数funcinit(){fmt.Println(第一个 init)}funcinit(){fmt.Println(第二个 init)}// 3. 最后执行 main 函数funcmain(){fmt.Println(main 函数)}// 输出顺序// 初始化变量// 第一个 init// 第二个 init// main 函数8. 包的组织结构最佳实践// models/user.gopackagemodelstypeUserstruct{IDintUsernamestringemailstring// 私有字段}// 工厂函数funcNewUser(idint,usernamestring)*User{returnUser{ID:id,Username:username,}}// 方法func(u*User)SetEmail(emailstring){u.emailemail}func(u*User)GetEmail()string{returnu.email}9. 内部包internal// 目录结构project/├──go.mod ├── internal/│ └── auth/│ └── auth.go// 只能被 project 内的包导入├── pkg/│ └── public/│ └── public.go// 可以被外部导入└── cmd/└── app/└── main.go// internal/auth/auth.gopackageauth// 这个函数只能被同一模块内的包使用funcValidateToken(tokenstring)bool{returntokenvalid}// cmd/app/main.gopackagemainimport(myproject/internal/auth// 允许在同一模块内)funcmain(){auth.ValidateToken(token)// 可以使用}10. 循环导入问题及解决错误的做法会产生循环导入// package apackageaimportmyproject/btypeAstruct{B*b.B}funcNewA()*A{returnA{B:b.NewB(),}}// package bpackagebimportmyproject/a// 循环导入typeBstruct{A*a.A}funcNewB()*B{returnB{A:a.NewA(),}}解决方案使用接口// interfaces/service.gopackageinterfacestypeServiceAinterface{DoSomething()}typeServiceBinterface{DoAnother()}// service/a.gopackageserviceimportmyproject/interfacestypeServiceAImplstruct{B interfaces.ServiceB}func(s*ServiceAImpl)DoSomething(){s.B.DoAnother()}// service/b.gopackageserviceimportmyproject/interfacestypeServiceBImplstruct{A interfaces.ServiceA}func(s*ServiceBImpl)DoAnother(){s.A.DoSomething()}11. 包文档// calculator package 提供了基本的数学运算功能//// 这个包包含了加、减、乘、除等基本运算函数。// 所有函数都支持整数运算。packagecalculatorimporterrors// Add 返回两个整数的和//// 示例://// sum : Add(5, 3)// fmt.Println(sum) // 输出: 8funcAdd(a,bint)int{returnab}// Divide 执行除法运算// 如果除数为 0返回错误funcDivide(a,bint)(int,error){ifb0{return0,errors.New(division by zero)}returna/b,nil}查看文档go doc calculator go doc calculator.Add12. 常用标准库包packagemainimport(encoding/jsonfmtio/ioutillognet/httpostime)funcmain(){// fmt: 格式化 I/Ofmt.Println(Hello, World!)// os: 操作系统功能file,err:os.Create(test.txt)// time: 时间处理now:time.Now()// json: JSON 编解码data,_:json.Marshal(map[string]string{name:test})// http: HTTP 客户端和服务器resp,_:http.Get(http://example.com)// ioutil: I/O 工具content,_:ioutil.ReadFile(file.txt)// log: 日志记录log.Printf(程序执行完成)}13. 第三方包管理# 添加依赖go get github.com/gin-gonic/gin# 更新依赖go get-ugithub.com/gin-gonic/gin# 整理依赖移除未使用的go mod tidy# 查看依赖go list-mall# 升级所有依赖go get-u./...// 使用第三方包packagemainimport(github.com/gin-gonic/gin)funcmain(){r:gin.Default()r.GET(/ping,func(c*gin.Context){c.JSON(200,gin.H{message:pong,})})r.Run()}14. 包版本管理// go.mod 文件示例module myprojectgo1.21require(github.com/gin-gonic/gin v1.9.0github.com/go-redis/redis/v8 v8.11.5)// 版本选择规则// v1.2.3: 语义化版本// v0.0.0-20210101123456-456789abcdef: 伪版本// v2.0.0incompatible: 不兼容版本15. 总结每个 Go 文件都必须属于一个包main 包是程序的入口首字母大写表示公开小写表示私有使用 go mod 管理依赖避免循环导入包名应该简洁、有意义合理使用 init 函数internal 目录用于限制包的访问为公开的 API 编写文档注释这些是 Go 包的核心用法掌握它们可以帮助你更好地组织和复用代码噢。