Go语言学习之 Day04
包&模块
单元测试
常用包
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")
//test()
//testFatal()
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("金融量化投资")
// Raw编码
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))
// RawURL
// 编码
rs = base64.RawURLEncoding.EncodeToString(ctx)
t.Log(rs)
txt, _ = base64.RawURLEncoding.DecodeString(rs)
t.Log(string(txt))
// URL 编码
// 编码
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)) // fmt.Printf("")
t.Log(hash)
hasher := md5.New()
hasher.Write([]byte("我爱"))
hasher.Write([]byte("中国"))
hash = fmt.Sprintf("%x", hasher.Sum(nil))
t.Log(hash)
// sha1
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)
// sha256
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)
// sha512
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) {
// time
// 时间: 字符串格式 unix时间戳 结构化格式
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秒"))
// Unixtime => Time
t.Log(time.Unix(1234123421, 0))
// 字符串 => Time
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)
}
}()
// panic("test")
return
}
func test(f bool) {
if f {
return
}
defer func() { // 注册
fmt.Println(1)
}()
defer fmt.Println(2)
}
func main() {
test(false) // defer 执行
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://pkg.go.dev/
base64
标准的
大小写英文字母数字+/
原始的
Padding 最后的结果3的倍数 不是3的倍数 ==补齐
URL的
大小写英文字母数字-_