青训营后端go第一节课笔记 | go的基本语法与项目中的注意点 | 青训营笔记

107 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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转化为结构体;

代码生成

Json生成结构体

  • Preview -> Copy value

Socks5代理器

这个项目较为复杂,一定要熟悉其中的原理,熟悉他的逻辑,这样才能顺利写出来!