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的
            大小写英文字母数字-_
posted @ 2023-01-15 20:50  元贞  阅读(26)  评论(0编辑  收藏  举报