这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
语法问题(不同于C的细节们):
因为有其他语言的基础,快速入门go语言只记录与其他语言的区别(与c对照)
if else 和 for 语句中没有括号
常见的分支语句:
if err != nil {
log.Fatal(err)
}
for循环
只有for一种循环,既可以里面什么都不写作为死循环,又可以写作c的for循环
死循环:
for {
fmt.Println("我陷入死循环了!!!!")
}
类似while的循环
i := 1
for i <= 3 {
fmt.Println(i)
i = i + 1
}
类似于c中的for循环:
for j := 7; j < 9; j++ {
fmt.Println(j)
}
迭代遍历:
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item)
}
switch
switch case:不同于c执行一个分支后会执行后面的语句,go语言会直接break。
在语句中可以使用任意的类型
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
slice
使用make来进行切片,go不同于python切片不支持负数索引,所以需要借助len()方法进行处理
s := make([]string, 3)
s[0] = "a"
s = append(s, "e", "f")
func
go的变量类型是后知的,函数可以返回多个返回值,一般第一个是真实的返回值,第二个是错误信息。
结构体
type user struct {
name string
password string
}
函数也是有指针和非指针两种
func (u user) checkPassword(password string) bool {
return u.password == password
}
这样的话就变了结构体的成员函数了;
func (u *user) resetPassword(password string) {
u.password = password
}
字符串操作:
fmt.Println(strings.Contains(a, "ll")) // true
fmt.Println(strings.Count(a, "l")) // 2
fmt.Println(strings.HasPrefix(a, "he")) // true
fmt.Println(strings.HasSuffix(a, "llo")) // true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(a, 2)) // hellohello
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a))
字符串格式化:
fmt.Printf("s=%v\n", s) // s=hello
fmt.Printf("n=%v\n", n) // n=123
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}
json处理:
json再go中可以和结构体进行相互解析转换
在定义结构体的时候,如果字段名和json中不同,在后面加入 json : "jsonName"即可
type userInfo struct {
Name string
Age int `json:"age"`
Hobby []string
}
在json和结构体的相互转换中主要使用json.MarshalIndent()和json.Unmarshal()方法
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
var b userInfo
err = json.Unmarshal(buf, &b)
小细节是后面的结构体的引用需要加一个取地址符,不然无法对结构体进行修改
时间处理
time.Now()获取当前的时间
time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)设置时间
另外常用的是时间戳:
fmt.Println(now.Unix()) // 1648738080
数字解析
主要是strconv.ParseInt()转换进制,strconv.Atoi()将其他类型转换为整型
n, _ = strconv.ParseInt("0x1000", 0, 64)
fmt.Println(n) // 4096
n2, _ := strconv.Atoi("123")
fmt.Println(n2) // 123
项目中的问题
在小项目中不熟练的go语法给我带来了很多的困难,在以后的学习中要恶补语法了!
首先是第二个项目中的抓包后,利用外部网站自动生成代码和利用json转化为结构体;
代码生成
- copy as cURL(bash)
- curlconverter.com/#go
Json生成结构体
- Preview -> Copy value
Socks5代理器
这个项目较为复杂,一定要熟悉其中的原理,熟悉他的逻辑,这样才能顺利写出来!