包&模块
单元测试
常用包
log
点击查看代码
| package main |
| |
| import ( |
| "fmt" |
| "log" |
| ) |
| |
| func test() { |
| defer func() { |
| recover() |
| }() |
| log.Panicln("panic") |
| } |
| |
| func testFatal() { |
| log.Fatalln("fatal") |
| } |
| |
| func main() { |
| log.Print("00.我叫lele") |
| fmt.Println(log.Flags()) |
| |
| log.SetPrefix("前缀:") |
| log.SetFlags(log.Ldate) |
| log.Println("01.我叫kevin") |
| |
| log.SetFlags(log.Ltime) |
| log.Printf("日志: %s", "02.我叫fadewalk") |
| |
| log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile) |
| log.Println("lalala") |
| |
| |
| |
| log.Println("over") |
| } |
| |
输出
| 2023/01/18 20:05:35 00.我叫lele |
| 3 |
| 前缀:2023/01/18 01.我叫kevin |
| 前缀:20:05:35 日志: 02.我叫fadewalk |
| 前缀:2023/01/18 20:05:35.569741 main.go:31: lalala |
| 前缀:2023/01/18 20:05:35.569741 main.go:35: over |
| |
base64
点击查看代码
| package main |
| |
| import ( |
| "encoding/base64" |
| "testing" |
| ) |
| |
| func TestBase64(t *testing.T) { |
| ctx := []byte("金融量化投资") |
| |
| |
| rs := base64.RawStdEncoding.EncodeToString(ctx) |
| t.Log(rs) |
| |
| |
| txt, _ := base64.RawStdEncoding.DecodeString(rs) |
| t.Log(string(txt)) |
| |
| |
| |
| rs = base64.StdEncoding.EncodeToString(ctx) |
| t.Log(rs) |
| |
| |
| txt, _ = base64.StdEncoding.DecodeString(rs) |
| t.Log(string(txt)) |
| |
| |
| |
| rs = base64.RawURLEncoding.EncodeToString(ctx) |
| t.Log(rs) |
| |
| txt, _ = base64.RawURLEncoding.DecodeString(rs) |
| t.Log(string(txt)) |
| |
| |
| |
| rs = base64.URLEncoding.EncodeToString(ctx) |
| t.Log(rs) |
| txt, _ = base64.URLEncoding.DecodeString(rs) |
| t.Log(string(txt)) |
| } |
| |
hash
点击查看代码
| package hash |
| |
| import ( |
| "crypto/md5" |
| "crypto/sha1" |
| "crypto/sha256" |
| "crypto/sha512" |
| "fmt" |
| "testing" |
| ) |
| |
| func TestHash(t *testing.T) { |
| ctx := []byte("我爱中国") |
| hash := fmt.Sprintf("%x", md5.Sum(ctx)) |
| t.Log(hash) |
| |
| hasher := md5.New() |
| hasher.Write([]byte("我爱")) |
| hasher.Write([]byte("中国")) |
| |
| hash = fmt.Sprintf("%x", hasher.Sum(nil)) |
| t.Log(hash) |
| |
| |
| |
| t.Logf("%x\n", sha1.Sum(ctx)) |
| |
| hasher = sha1.New() |
| hasher.Write([]byte("我爱")) |
| hasher.Write([]byte("中国")) |
| hash = fmt.Sprintf("%x", hasher.Sum(nil)) |
| t.Log(hash) |
| |
| |
| t.Logf("%x\n", sha256.Sum256(ctx)) |
| |
| hasher = sha256.New() |
| hasher.Write([]byte("我爱")) |
| hasher.Write([]byte("中国")) |
| hash = fmt.Sprintf("%x", hasher.Sum(nil)) |
| t.Log(hash) |
| |
| |
| t.Logf("%x\n", sha512.Sum512(ctx)) |
| hasher = sha512.New() |
| hasher.Write([]byte("我爱")) |
| hasher.Write([]byte("中国")) |
| hash = fmt.Sprintf("%x", sha512.Sum512(nil)) |
| t.Log(hash) |
| } |
| |
输出
| === RUN TestBase64 |
| base64_test.go:13: 6YeR6J6N6YeP5YyW5oqV6LWE |
| base64_test.go:17: 金融量化投资 |
| base64_test.go:22: 6YeR6J6N6YeP5YyW5oqV6LWE |
| base64_test.go:26: 金融量化投资 |
| base64_test.go:31: 6YeR6J6N6YeP5YyW5oqV6LWE |
| base64_test.go:34: 金融量化投资 |
| base64_test.go:39: 6YeR6J6N6YeP5YyW5oqV6LWE |
| base64_test.go:41: 金融量化投资 |
| --- PASS: TestBase64 (0.00s) |
| PASS |
os
点击查看代码
| package main |
| |
| import ( |
| "fmt" |
| "os" |
| ) |
| |
| func main() { |
| fmt.Println(os.Args) |
| } |
| |
flag
点击查看代码
| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| ) |
| |
| func main() { |
| |
| var ( |
| host string |
| port int |
| verbose bool |
| help bool |
| ) |
| |
| flag.StringVar(&host, "H", "127.0.0.1", "连接地址") |
| flag.IntVar(&port, "port", 8080, "连接端口") |
| flag.BoolVar(&verbose, "v", false, "显示详情") |
| flag.BoolVar(&help, "h", false, "帮助") |
| |
| flag.Usage = func() { |
| fmt.Println("usage: ssh -H 127.0.0.1 --port 8080 -v -h touch /tmp/kk.txt") |
| flag.PrintDefaults() |
| } |
| |
| flag.Parse() |
| |
| if help { |
| flag.Usage() |
| return |
| } |
| |
| fmt.Println(host, port, verbose, help, flag.Args()) |
| } |
| |
点击查看代码
| C:\Users\wenyu\GolandProjects\mage_go\day04\flag>go run main.go -h |
| usage: ssh -H 127.0.0.1 --port 8080 -v -h touch /tmp/kk.txt |
| -H string |
| 连接地址 (default "127.0.0.1") |
| -h 帮助 |
| -port int |
| 连接端口 (default 8080) |
| -v 显示详情 |
| |
time
点击查看代码
| package time |
| |
| import ( |
| "testing" |
| "time" |
| ) |
| |
| func TestTime(t *testing.T) { |
| |
| |
| now := time.Now() |
| t.Logf("%T %v \n", now, now) |
| t.Log(now.Unix()) |
| t.Log(now.Format("2006-01-02")) |
| t.Log(now.Format("03:04:05")) |
| t.Log(now.Format("15:04:05")) |
| t.Log(now.Format("2006-01-02 15:04:05")) |
| t.Log(now.Format("2006年01月02日15时04分05秒")) |
| |
| |
| |
| t.Log(time.Unix(1234123421, 0)) |
| |
| |
| t.Log(time.Parse("2006-01-02", "2021-05-10")) |
| t.Log(time.Parse("15-01-02", "2021-05-10")) |
| t.Log(time.Parse("2006-01-02 15:04:05", "2021-05-10 05:05:05")) |
| } |
| |
输出
| === RUN TestTime |
| time_test.go:12: time.Time 2023-01-18 20:07:28.3415031 +0800 CST m=+0.006144401 |
| time_test.go:13: 1674043648 |
| time_test.go:14: 2023-01-18 |
| time_test.go:15: 08:07:28 |
| time_test.go:16: 20:07:28 |
| time_test.go:17: 2023-01-18 20:07:28 |
| time_test.go:18: 2023年01月18日20时07分28秒 |
| time_test.go:22: 2009-02-09 04:03:41 +0800 CST |
| time_test.go:25: 2021-05-10 00:00:00 +0000 UTC <nil> |
| |
| time_test.go:26: 0001-01-01 00:00:00 +0000 UTC parsing time "2021-05-10" as "15-01-02": cannot parse "21-05-10" as "-" |
| time_test.go:27: 2021-05-10 05:05:05 +0000 UTC <nil> |
| |
| --- PASS: TestTime (0.03s) |
| PASS |
defer
点击查看代码
| package main |
| |
| import "fmt" |
| |
| func e() (err error) { |
| defer func() { |
| if errMsg := recover(); errMsg != nil { |
| err = fmt.Errorf("%s", errMsg) |
| } |
| }() |
| |
| return |
| } |
| |
| func test(f bool) { |
| if f { |
| return |
| } |
| defer func() { |
| fmt.Println(1) |
| }() |
| defer fmt.Println(2) |
| |
| } |
| |
| func main() { |
| test(false) |
| test(true) |
| } |
| |
小节
点击查看代码
| 包,模块 |
| |
| 代码main => 分函数 => 分文件 => 分文件夹 |
| |
| 代码的整理(项目的组织方式) |
| |
| 方案一. 1.11 之前 |
| gopath+vendor |
| 其他开源方案 |
| |
| gopath |
| => GOPATH=> 配置一个或多个目录 linux => : windows => ; |
| 代码必须放在GOPATH目录下 |
| src => 源码 |
| bin => 放二进制文件 |
| pkg => 第三方包(经过编译过的.a文件) |
| |
| vendor => 任何目录 |
| go => 当前目录查找 vendor(无vendor或有vendor无包)-> 上一级目录 -> ... -> gopath vendor -> gopath -> 标准包 -> 报错 |
| |
| 第三方别人开发的包 => github.com |
| => 下载 |
| => gopath src |
| |
| go工具 |
| go build |
| |
| go install 第三方包地址 |
| go get 第三方包地址 github.com/imsilence/xxx |
| git工具 |
| svn工具 |
| |
| |
| 方案二. 1.11及之后(重点) |
| GOMODULE |
| |
| GO111MODULE=on/off/auto |
| on => 启用module |
| off => 关闭module => gopath+vendor |
| auto => 自动判断 |
| 依据: 代码不在GOPATH目录,目录存在go.mod文件 => module 否则为gopath+vendor |
| |
| GO 1.11 MODULE |
| 初始化模块 |
| go mod init 模块名称 |
| cmdb => 简单 第三方包使用 |
| github.com/imsilence/cmdb => |
| |
| github.com/imsilence/math |
| |
| 版本: git/svn => tag v0.x.x v1.x.x |
| |
| |
| |
| 包: |
| 包名 => 在同一个文件夹内包名必须一致 |
| main包 => 编译为可执行的结果 |
| 若功能不需要编译为可执行程序 => 功能代码(第三方包) => 命名为非main => 可以任意定义 => 标识符规范 => 一般使用文件夹的名称 |
| 不在同一个包下面调用不同文件中定义的函数 => |
| 导入 目录路径 |
| 调用 包名.函数名称 |
| |
| 包(变量/函数)可见性 |
| 首字母大小写的问题 |
| |
| math |
| PI |
| Add() |
| |
| |
| 导入 |
| 绝对路径导入 |
| gopath src 下的目录 |
| gomod 同模块 模块名称/路径 |
| 第三方模块 第三方模块名称/路径 |
| 别名导入 |
| 导入多个包名相同(不同目录下) |
| 下划线导入 |
| 包 初始化 init |
| 相对路径导入 go mod中禁用 |
| 点导入 |
| |
| |
| 可见性 |
| 只能在包内可以:包内可见, 变量名称小写 |
| 可以在包外使用: 包外可见, 变量名称大写 |
| |
| |
| Go程序的入口 |
| init函数 => 首先init |
| main -> a(a->c),b(b->c) c init |
| main函数 => main包 |
| main包 => 二进制程序 => 导入其他模块/其他包 |
| |
| |
| go mod replace |
| google.com/x/system => github.com/google/system [镜像包] |
| go mod edit --replace=google.com/x/system@version=github.com/google/system@version |
| |
| |
| 包: |
| 标准 |
| 第三方 |
| |
| |
| 积累 + 思路 |
| |
| 标准包: |
| golang.google.cn |
| go doc |
| |
| 第三方包: |
| https: |
| |
| |
| base64 |
| 标准的 |
| 大小写英文字母数字+/ |
| 原始的 |
| Padding 最后的结果3的倍数 不是3的倍数 ==补齐 |
| URL的 |
| 大小写英文字母数字-_ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2020-01-15 包和导包