Go 语言基础语法学习笔记1 | 青训营

76 阅读2分钟

课程源码 github.com/wangkechun/…

package main
import (
    "net/http"
)
​
func main() {
    http.Handle("/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":8080", nil)
}

hello world

package main
import "fmt"
func main() {
    fmt.Println("Hello, world!")
}
> go run main.go
Hello, world!
> go build main.go
> ./main
Hello, world!

数组:

  • var a [5]int
  • b := [5]int{1, 2, 3, 4, 5}

切片:

  • s := make([]string, 3)

map:

  • m := make(map[string]int)
  • r, ok := m["unknow"]
  • delete(m, "one")

range:

  • 返回:索引、对应位置的值
  • 不需要索引,可以用下划线代替

字符串格式化:

  • %+v 打印详细结果
  • %#v 打印更详细的结果

Json

  • 对于结构体,保证字段的首字母大写,即可使用 json.Marshaler(a) 序列化为 JSON 字符串
  • 反序列化:json.Unmarshaler(buf, &b)
  • 格式化输出:buf, err = json.MarshalIndent(a, "", "\t")

时间:

数字解析

  • strconv.Atoi 字符串2数字
  • strconv.itoA 数字2字符串

生成随机数:使用时间戳来初始化随机数种子

  • rand.Seed(time.Now().UnixNano())
  • secretNumber := rand.Intn(maxNum)

读取用户输入:

  • import "bufio"
  • reader := bufio.NewReader(os.Stdin)
  • input, err := reader.ReadString('\n') 读取一行输入
  • input = strings.Trim(input, "\r\n") 去除换行符

代码生成:

  • 浏览器请求,右键 copy as curl (bash) 可以得到 json 字符串

  • 代码生成网站:curlconverter.com/#go

    • 创建请求:req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/translator", data)

    • 设置请求头:req.Header.Set("xxx","xxx")

    • 发起请求:resp, err := client.Do(req)

      • 手动关闭:defer resp.Body.Close()
    • 读取响应:bodyText, err := io.ReadAll(resp.Body)

在线词典:

  • 生成请求

    client := &http.Client{}
    request := DictRequest{TransType: "en2zh", Source: "good"}
    buf, err := json.Marshal(request)
    if err != nil {
        log.Fatal(err)
    }
    var data = bytes.NewReader(buf)
    req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
    
  • 解析 response body

    • 写一个结构体,把返回的 json 反序列化到结构体里面

    • json2go 的解析网站:oktools.net/json2go

      var dictResponse DictResponse                       // 定义结构体
      err = json.Unmarshal(bodyText, &dictResponse)
      

SOCKS5 代理

  • SOCKS5 代理可以让授权的用户通过单个端口去访问内部的所有资源

  • 设置代理服务器后访问网站的过程:浏览器和 socks5 代理建立 TCP 连接,代理和服务器建立 TCP 连接

    • 握手:浏览器向 socks5 代理发送请求,socks5 选择一个认证方式返回给浏览器
    • 认证
    • 请求:浏览器向 socks5 代理发起连接请求,代理服务器和后端服务器建立 TCP 连接,收到响应
    • relay:浏览器发送请求,代理转发请求
  • TCP echo server

    • 监听端口:server, err := net.Listen("tcp", "127.0.0.1:1080")
    • 接收请求:client, err := server.Accept()
    • 处理连接:go process(client) ,参数类型是 net.Conn

依赖的演进:

  • GOPATH, Go Vendor, Go Module