GO基础与实战|青训营笔记

65 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、本堂课重点内容:

  • 什么是go?go语言介绍(go的优势)
  • 安装go的开发环境
  • go基础语法
  • go语言实战

二、详细知识点介绍:

  • go

    • 高性能 高并发
    • 语法简单、学习曲线平缓
    • 丰富的标准库
    • 完善的工具链(编译、代码格式化、错误检查等等)
    • 静态连接
    • 快速编译
    • 跨平台
    • 垃圾回收
  • go基础语法

    • 字符串为内置类型 可以使用+号拼接 可以用等号判断是否相等
    • 变量声明 1.var 2.:=
    • 常量声明 const
    • if else 是没有括号的
    • 循环只有for循环 没有while循环
    • switch case 不需要加break就可以只跑一个分支 switch也可以为任何类型
    • 数组为定长的 定义数组也是 var 或者 :=
    • 切片不同于数组 切片为可变长数组 切片可以用make来创建 append来追加元素
    • 切片存储的是 长度、容量、指向数组的指针
    • copy可以用来拷贝切片
    • map 创建方式与切片类似
    • map是完全无序的
    • golang的函数可以返回多个参数
    • golang的指针主要是用于函数对变量的修改
    • golang结构体 带类型的字段的集合
    • 在函数返回中加入错误参数error,并用if else判断函数是否出现错误
    • 字符串工具包 strings
    • 结构体的json处理 json.Marshal() json->结构体 json.UnMarshal()
    • 字符串与数字的转换 使用strconv这个包

三、实践练习例子:

  • 猜谜游戏

        package main
    
        import (
            "bufio"
           "fmt"
           "math/rand"
           "os"
           "strconv"
           "strings"
           "time"
        )
    
        func main() {
           maxNum := 100
           rand.Seed(time.Now().UnixNano())
           secretNumber := rand.Intn(maxNum)
    
           fmt.Println("Please input your guess")
           reader := bufio.NewReader(os.Stdin)
           for {
              input, err := reader.ReadString('\n')
              if err != nil {
                 fmt.Println("An error occured while reading input. Please try again", err)
                 continue
              }
              input = strings.Trim(input, "\r\n")
    
              guess, err := strconv.Atoi(input)
              if err != nil {
                 fmt.Println("Invalid input. Please enter an integer value")
                 continue
              }
              fmt.Println("You guess is", guess)
              if guess > secretNumber {
                 fmt.Println("Your guess is bigger than the secret number. Please try again")
              } else if guess < secretNumber {
                 fmt.Println("Your guess is smaller than the secret number. Please try again")
              } else {
                 fmt.Println("Correct, you Legend!")
                 break
              }
           }
        } 
    
  • 在线词典

    package main

    import (
       "bytes"
       "encoding/json"
       "fmt"
       "io/ioutil"
       "log"
       "net/http"
       "os"
    )

    type DictRequest struct {
       TransType string `json:"trans_type"`
       Source    string `json:"source"`
       UserID    string `json:"user_id"`
    }

    type DictResponse struct {
       Rc   int `json:"rc"`
       Wiki struct {
          KnownInLaguages int `json:"known_in_laguages"`
          Description     struct {
             Source string      `json:"source"`
             Target interface{} `json:"target"`
          } `json:"description"`
          ID   string `json:"id"`
          Item struct {
             Source string `json:"source"`
             Target string `json:"target"`
          } `json:"item"`
          ImageURL  string `json:"image_url"`
          IsSubject string `json:"is_subject"`
          Sitelink  string `json:"sitelink"`
       } `json:"wiki"`
       Dictionary struct {
          Prons struct {
             EnUs string `json:"en-us"`
             En   string `json:"en"`
          } `json:"prons"`
          Explanations []string      `json:"explanations"`
          Synonym      []string      `json:"synonym"`
          Antonym      []string      `json:"antonym"`
          WqxExample   [][]string    `json:"wqx_example"`
          Entry        string        `json:"entry"`
          Type         string        `json:"type"`
          Related      []interface{} `json:"related"`
          Source       string        `json:"source"`
       } `json:"dictionary"`
    }

    func query(word string) {
       client := &http.Client{}
       request := DictRequest{TransType: "en2zh", Source: word}
       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)
       if err != nil {
          log.Fatal(err)
       }
       req.Header.Set("Connection", "keep-alive")
       req.Header.Set("DNT", "1")
       req.Header.Set("os-version", "")
       req.Header.Set("sec-ch-ua-mobile", "?0")
       req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
       req.Header.Set("app-name", "xy")
       req.Header.Set("Content-Type", "application/json;charset=UTF-8")
       req.Header.Set("Accept", "application/json, text/plain, */*")
       req.Header.Set("device-id", "")
       req.Header.Set("os-type", "web")
       req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
       req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
       req.Header.Set("Sec-Fetch-Site", "cross-site")
       req.Header.Set("Sec-Fetch-Mode", "cors")
       req.Header.Set("Sec-Fetch-Dest", "empty")
       req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
       req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
       req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
       resp, err := client.Do(req)
       if err != nil {
          log.Fatal(err)
       }
       defer resp.Body.Close()
       bodyText, err := ioutil.ReadAll(resp.Body)
       if err != nil {
          log.Fatal(err)
       }
       if resp.StatusCode != 200 {
          log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
       }
       var dictResponse DictResponse
       err = json.Unmarshal(bodyText, &dictResponse)
       if err != nil {
          log.Fatal(err)
       }
       fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
       for _, item := range dictResponse.Dictionary.Explanations {
          fmt.Println(item)
       }
    }

    func main() {
       if len(os.Args) != 2 {
          fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
    example: simpleDict hello
          `)
          os.Exit(1)
       }
       word := os.Args[1]
       query(word)
    }

四、课后个人总结:

  • 通过本节课的学习,能够掌握了golang的基础语法,以及各个包的使用。
  • 在案例实践中,学习了在线代码生成的工具的使用,自动生成req请求以及自动生成json结构体。以及简单代理服务器的编写,学习了golang对于tcp连接的处理。