这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
一、搭建开发环境
我使用的Windows平台,我就以Windows平台为例。
1.在官网下载go的安装包
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
2.配置系统环境变量GOROOT
3.配置系统环境变量GOPROXY
Go1.14版本后,都推荐使用go mod模式来管理依赖环境了,也不强制我们必须把代码写在GOPATH下的src目录下了,
所以你可以在电脑的任意位置编写go代码了。默认的GOPROXY的配置是GOPROXY=https://proxy.golang.org,direct
由于国内访问不到https://proxy.golang.org ,所以我们需要换一个PROXY,
这里推荐使用https://goproxy.io 或 https://goproxy.cn。
可以执行下面的命令修改GOPROXY:go env -w GOPROXY=https://goproxy.cn,direct
二、基础语法
go语言的变量和方法定义与Java不同,go是变量名在前,数据类型在后,而Java相反
go的数据类型:
1. 基本数据类型
整型 int
浮点型 float32,float64
复数 complex64,complex128
字符串 string
布尔值 bool
2. 聚合类型
数组
结构体
3. 引用类型
指针
切片
集合
函数
channel
4. 接口类型
go的变量定义格式:
var [变量名] [数据类型]
例如:
var num int
var str string
var nums [3]int
var slice []string
var map map[int]string
go的错误处理:
go语言中有一个error类,用来返回错误信息,我们只需要获得返回的错误对象,就可以知道一些错误信息
字符串的一些操作:
package main
import (
"fmt"
"strings"
)
func main() {
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // 判断a中是否包含ll
fmt.Println(strings.Count(a, "l")) // 计算a中的l的数量
fmt.Println(strings.HasPrefix(a, "he")) // 判断a是否是he前缀
fmt.Println(strings.HasSuffix(a, "llo")) // 判断a是否是llo后缀
fmt.Println(strings.Index(a, "ll")) // 返回ll在a中的位置
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // 将he和llo用-连接
fmt.Println(strings.Repeat(a, 2)) // 将a翻倍
fmt.Println(strings.Replace(a, "e", "E", -1)) // 将a中的e转换成E
fmt.Println(strings.Split("a-b-c", "-")) // 将a-b-c以-分割成一个字符数组
fmt.Println(strings.ToLower(a)) // 全部转小写
fmt.Println(strings.ToUpper(a)) // 全部转大写
fmt.Println(len(a)) // a的长度
b := "你好"
fmt.Println(len(b)) // 一个中文汉字对应3个长度
}
字符串格式化:
格式控制符:%d 整型,%s字符串,%f浮点型,%v任意类型
%v只能打印变量值
%+v打印变量名和值
%#v打印具体类下的变量名和值
fmt.Printf("p=%v\n", p) // p={1 2}
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}
f := 3.141592653
fmt.Println(f) // 3.141592653
fmt.Printf("%.2f\n", f) // 3.14
}
JSON格式处理:
想要结构体能够序列化则需要首字母大写,并在结构体的字段后面加上`json:"[name]"`
type userInfo struct {
Name strin `json:"name"`
Age int `json:"age"`
Hobby []string
}
序列化:
a := userInfo{Name: "xu", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
反序列化:
buf为上面序列化成功的字节数组
var b userInfo
err = json.Unmarshal(buf, &b)
时间处理:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now) // 获取当前时间
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC) //获取当前日期和时间
fmt.Println(t)
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 获得当前的年月日时分
fmt.Println(t.Format("2006-01-02 15:04:05")) // 将当前时间按照format格式输出
diff := t2.Sub(t)
fmt.Println(diff) // 1h5m0s
fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
if err != nil {
panic(err)
}
fmt.Println(t3 == t) // true
fmt.Println(now.Unix()) // 获取时间戳
}
三、猜字谜游戏
如何获取随机数?
1.首先要设置随机数种子 rand.Seed(time.Now().UnixNano())
2.然后才能获得随机数,使用rand类 secretNumber := rand.Intn(100)
如何从键盘输入整数?
_, err := fmt.Scanf("%d\n", &guess)
在这里有一个坑,使用scanf读取的时候,会读取到上一次遗留的换行符\n,所以导致进行一次输入后直接进行第二次读取
并返回错误。错误如下图所示,所以在%d后面加一个\n,这样可以保证下次读取的时候,开头没有换行符
四、命令行字典
这里关键就是如何使用下面两个工具来生成Go代码了
[JSON转Golang Struct - 在线工具 - OKTools](https://oktools.net/json2go)
[Convert curl commands to code](https://curlconverter.com/)
第一个可以将json字符串自动生成对应的结构体代码
第二个可以根据接口url地址,自动生成请求该接口的Go代码
五、SOCKS5代理
....还没搞太明白....