Go2编程指南

目录1.1 Go1的诺言1.2 Go1到Go1.101.3 Go1.10过渡到Go21.4 Go2诞生第1章 语法变迁2.1 Go1的包机制2.2 基于vendor的版本管理2.3 模块的设计⽬标2.4 模块快速⼊⻔2.5 子模块和多版本共存2.6 镜像和私有仓库2.7 模块化实践中的一些问题第2章 模块化第3章 错误处理Go2编程指南

January 22, 2021

golang 数组与切片的区别

golang 的数组与切片有两大区别: 初始化:数组需要明确指定大小,切片不需要 函数传递:数组是值传递,切片是地址传递 初始化 数组 a := [...]int{1,2,3} a := [3]int{1,2,3} 切片 a:= []int{1,2,3} a := make([]int, 5) a := make([]int, 5, 10) slice的数据结构: go源码slice的数据结构定义: type slice struct { array unsafe.Pointer len int cap int } slice 有三个字段: 指向真实 array 地址的指针 ptr slice 的长度 len 容量 cap 特性 通过例子说明 slice 和 array 的一些特性。 函数传递 数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递 a := [...]int{1, 2, 3, 4, 5, 6} fmt.Println("star deal array, orginal data is:") fmt.Println(a) aMaxIndex := len(a) - 1 fmt.Printf("aMaxIndex:%d\r", aMaxIndex) for i, e := range a { if i == aMaxIndex { a[0] += e fmt.Printf("index is 0, val is :%d\r", a[0]) } else { a[i+1] += e fmt....

November 19, 2020

go 匿名结构体 数组 示例

在用 vscode 生成测试用例的时候,生成了测试的匿名数组,没怎么用过,这里展示了 go 匿名结构体数组示例 import "testing" func TestGetRandomString(t *testing.T) { type args struct { lens int } tests := []struct { name string args args want string }{ { name: "test", args: args{ lens: 6, }, want: "hi", }, { name: "test", args: args{ lens: 6, }, want: "hi", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := GetRandomString(tt.args.lens); got != tt.want { t.Logf("GetRandomString() = %v, want %v", got, tt.want) } }) } } 需要注意的是各个结构体后面有个逗号。

November 9, 2020

beego 通过acme.sh 使用 https

beego 通过 acme.sh 使用 https 安装acms.sh curl https://get.acme.sh | sh 生成证书 如果使用的是 beego 框架,需添加可访问的静态文件目录: //acme.sh 自动验证网站目录,不使用https可以忽略 beego.SetStaticPath("/.well-known", ".well-known") acme.sh --issue -d haokiu.com -d www.haokiu.com --webroot /usr/local/pixiublog/ 设置pixiublog开机启动 1. 编写开机启动脚本 vim /usr/lib/systemd/system/pixiublog.service [Unit] Description=The pixiublog Process Manager After=syslog.target network.target [Service] Type=forking ExecStart=sh /usr/local/pixiublog/start.sh ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID [Install] WantedBy=multi-user.target 2. 设置开机启动 systemctl enable pixiublog 安装证书 acme.sh --install-cert -d haokiu.com \ --cert-file /home/blog/cert/cert.pem \ --key-file /home/blog/cert/key.pem \ --fullchain-file /home/blog/cert/fullchain.pem \ --reloadcmd "systemctl restart pixiublog" beego app.conf 配置 EnableHTTPS = true HTTPSPort = 443 HTTPSCertFile = "/home/blog/cert/fullchain.pem" HTTPSKeyFile = "/home/blog/cert/key.pem" 参考 acme.sh 使用

October 13, 2020

go ... 作用

… 是go的一种语法糖。 作用 用于函数有多个不定参数的情况,可以接受多个不确定数量的参数 打散slice进行传递 例子 一、接受多个不确定数量的参数 func println(args ...string) { //可以接受任意个string参数 for _, v:= range args{ fmt.Println(v) } } func main(){ var strss= []string{ "qwr", "234", "yui", "cvbc", } println(strss...) //切片被打散传入 } 结果: qwr 234 yui cvbc 二、打散slice进行传递 var strss= []string{ "qwr", "234", "yui", } var strss2= []string{ "qqq", "aaa", "zzz", "zzz", } strss=append(strss,strss2...) //strss2的元素被打散一个个append进strss fmt.Println(strss) 结果: [qwr 234 yui qqq aaa zzz zzz] 最后 如果没有’…’,面对上面的情况,无疑会增加代码量。

October 12, 2020

golang 常用函数

1. 获取当前时间 时间戳(秒):time.Now().Unix 日期:time.Now().Format("2006-01-02 15:04:05") 注意:参数必须是 2006-01-02 15:04:05 而不能是自定义的年月日时间 2. 字符串与int转换 i,_ := strconv.Atoi("3") a := strconv.Itoa(32) 3.结构体json序列化 chatMsg := &ChatMsg{} err := json.Unmarshal([]byte(msg), chatMsg) //json转结构体 buf, _ := json.Marshal(chatMsg) //结构体转json return string(buf) 4.删除切片元素 mySlice := make([]int, 5) //创建一个初始元素个数为5的数组切片,元素初始值为0 mySlice = append(mySlice[:i], mySlice[i+1:]...) //删除下标为i的元素 mySlice = append(mySlice[:0], mySlice[1:]...) //删除第1个元素 5. url encode/decode encodeUrl:= url.QueryEscape(urltest) decodeUrl,err := url.QueryUnescape(encodeUrl) 6. base64编码 encodeString := base64.StdEncoding.EncodeToString(input) decodeBytes, err := base64.StdEncoding.DecodeString(encodeString) 7. 获取字符串长度 tips := "忍者" len := len(tips) //len=6 len := utf8.RuneCountInString(tips) //len=2 8. SubString func SubString(str string, start int32, end int32) string { result := []rune(str) length := int32(len(result)) if start < 0 || start > length { return str } if end < 0 || end > length { return str } return string(result[start:end]) } result = SubString(result, 0, int32(len([]rune(result)))-1)//注意end参数的取值 9....

October 10, 2020

golang 计算文件和字符串的 md5 值

go MD5 所需要的包在”crypto/md5”包中,需要先实例化一个MD5对象,然后在此基础上调用sum方法即可 文件的MD5 md5 := md5.New() io.Copy(md5,file) MD5Str := hex.EncodeToString(md5.Sum(nil)) 上面的代码实现了计算了文件MD5,其中file是multipart.File类型的,也可以是其他的已打开的其他文件类型。 当然也可以不使用io.copy,而是直接使用sum函数来计算: md5 := md5.New() MD5Str := hex.EncodeToString(md5.Sum(file)) 这样是直接调用了sum函数来计算文件的值可能要比io.copy稍微慢一些。 字符串的MD5 有时候需要将已知的一段字符串加密,其实和文件加密大概是类似的,只需要调用write方法将字符串写入hash中: md5 := md5.New() md5.Write([]byte("hello,world!")) MD5Str := hex.EncodeToString(md5.Sum(nil))

September 19, 2020

golang 判断目录或文件是否存在

golang 判断目录或文件是否存在: func Exist(path string) bool { _, err := os.Stat(path) return err == nil || os.IsExist(err) }

September 17, 2020

beego bee 工具使用简介

bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 您可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署。 bee 工具的安装 您可以通过如下的方式安装 bee 工具: go get github.com/beego/bee 安装完之后,bee 可执行文件默认存放在 $GOPATH/bin 里面,所以您需要把 $GOPATH/bin 添加到您的环境变量中,才可以进行下一步。 如何添加环境变量,请自行搜索 如果你本机设置了 GOBIN,那么上面的命令就会安装到 GOBIN 下,请添加 GOBIN 到你的环境变量中 bee 工具命令详解 我们在命令行输入 bee,可以看到如下的信息: Bee is a Fast and Flexible tool for managing your Beego Web Application. Usage: bee command [arguments] The commands are: version show the bee & beego version migrate run database migrations api create an api application base on beego framework bale packs non-Go files to Go source files new create an application base on beego framework run run the app which can hot compile pack compress an beego project fix Fixes your application by making it compatible with newer versions of Beego dlv Start a debugging session using Delve dockerize Generates a Dockerfile for your Beego application generate Source code generator hprose Creates an RPC application based on Hprose and Beego frameworks pack Compresses a Beego application into a single file rs Run customized scripts run Run the application by starting a local development server server serving static content over HTTP on port Use bee help [command] for more information about a command....

September 16, 2020

beego 日志配置

beego logs 的设计思路来自于 database/sql,目前支持的引擎有 file、console、net、smtp,可以通过如下方式进行安装: go get github.com/astaxie/beego/logs 如何使用 通用方式 首先引入包: import ( "github.com/astaxie/beego/logs" ) 然后添加输出引擎(log 支持同时输出到多个引擎),这里我们以 console 为例,第一个参数是引擎名(包括:console、file、conn、smtp、es、multifile) logs.SetLogger("console") 添加输出引擎也支持第二个参数,用来表示配置信息,详细的配置请看下面介绍: logs.SetLogger(logs.AdapterFile,`{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10,"color":true}`) 然后我们就可以在我们的逻辑中开始任意的使用了: package main import ( "github.com/astaxie/beego/logs" ) func main() { //an official log.Logger l := logs.GetLogger() l.Println("this is a message of http") //an official log.Logger with prefix ORM logs.GetLogger("ORM").Println("this is a message of orm") logs.Debug("my book is bought in the year of ", 2016) logs.Info("this %s cat is %v years old", "yellow", 3) logs.Warn("json is a type of kv like", map[string]int{"key": 2016}) logs.Error(1024, "is a very", "good game") logs.Critical("oh,crash") } 多个实例 一般推荐使用通用方式进行日志,但依然支持单独声明来使用独立的日志 package main import ( "github.com/astaxie/beego/logs" ) func main() { log := logs....

September 16, 2020