Go语言基础 | 青训营笔记

83 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。

Go语言前置

有高性能、高并发、丰富的标准库、垃圾挥手、跨平台等优势

Go语言基础

  • switch、if-else、循环等基础语法与其他语言相似不赘述
  • slice 真实业务代码中更多地使用切片(而非固定长度的数组)
//初始化方式
var identifier []type
slice1 := make([]type, len)
  • map Go中的字典,golang中的map是完全无序的,遍历的时候是随机顺序输出。
  • golang支持返回多个值 在实际业务代码中几乎所有函数都返回两个值,真正的返回结果以及错误信息。
  • Json操作 JSON.marshaler去序列化,变成json的字符串 序列化后的字符串也能用JSON.unmarshaler反序列化到一个空的变量里。
  • 获取时间戳的时候 可以用time.now.unix()

实战

猜谜游戏

image.png

  • 使用不同的随机数种子 生成不用的数
  • ReadString 去掉换行符再转换为数字,如果转换失败,我们同样打印错误并退出
  • bufio.NewReader来读取

在线词典

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}//创建http client  可以指定参数
	var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
        //创建请求 http方法、URL、body  
	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()//body是个流 为避免资源泄漏 增加defer来关闭这个流 在函数运行结束以后去运行 
	bodyText, err := ioutil.ReadAll(resp.Body)//读取流
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}
  • 生成 request body
  • 解析 response body 将json生成golang结构体 可借助oktools

补充:如何读取用户的键盘(控制台)输入呢?

从键盘和标准输入 os.Stdin 读取输入,最简单的办法是使用 fmt 包提供的 Scan 和 Sscan 开头的函数。 image.png 也可以使用 bufio 包提供的缓冲读取(buffered reader)来读取数据,正如以下例子所示:

image.png