《Go 语言上手-基础语言》笔记&课后作业 | 青训营笔记

172 阅读3分钟

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

基础结构

package main
import "fmt"
func main() {
    fmt.Println("Google" + "Runoob")
}

需要注意:

  • 包名和文件名/文件夹名没关系
  • 一个文件夹下面只能有一个包
  • { 不能单独放在一行

不同与Java书写习惯

  • 声明变量可以省略类型,使用var关键字,有简洁写法 := ,常量根据上下文自动确定类型
  • iffor后面都没有()括号
    • 都用for关键字,没有while循环
  • switchcase中不用加break;,自动返回
  • 切片Slice类似于变长数组,可以定义为任意类型
    • slice := make([]type, len, capicity) make创造切片时能指定初始长度和容量
  • map完全无序,range遍历时会返回序列和值,不需要可以用下划线忽略
    • for _,item := range nums
  • 函数的创建是 函数名(入参)(返参) 返回值可以有多个
func function_name( [parameter list] ) [return_types]{
    函数
}
  • 指针跟C++类似,&取值 *解除 nil为空
  • 错误需要自己创建自己返回,可通过实现error接口类型自定义错误信息
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}
  • fmt.Printf任意类型输出使用%v 详细信息使用%+v 包含函数与结构体使用%#v

课后作业

猜谜游戏

课程里面已经提示过了,使用 fmt.Scanf获取整型变量就行

    var guess int
    _, err := fmt.Scanf("%d\n", &guess)

获取另一个翻译引擎支持

年少不懂事选了有道翻译,折腾了大半天

1. 获取请求网址的相关信息

跟上课讲的步骤差不多,跟着抄,把Header相关参数设置好就行 微信图片_20220507203708.png

2. 创建提交表单数据

在测试的时候会发现,有道的sign,slat,lts参数是动态的,每次请求不同

请求1 salt=16519486483658&sign=e1b05f3c009c2aa3fb8bb8732a0b5be5&lts=1651948648365
请求2 salt=16519472230688&sign=81b65be634f2c6b404498fa812fa0035&lts=1651947223068

网上查询了一下资料,有Python调用有道翻译的,借鉴了一下方式。把fanyi.min.js弄下来看了一下源码,直接搜索关键词sign

var n = e("./jquery-1.7");
    e("./utils");
    e("./md5");
    var r = function (e) {
      var t = n.md5(navigator.appVersion),
        r = "" + (new Date).getTime(),
        i = r + parseInt(10 * Math.random(), 10);
      return {
        ts: r,
        bv: t,
        salt: i,
        sign: n.md5("fanyideskweb" + e + i + "Ygy_4c=r#e#4EX^NUGUc5")
      }
    };

这里的e是指查询的单词,isaltrlts
实现md5加密方式网上也有参考:

func MD5(v string) string {
	d := []byte(v)
	m := md5.New()
	m.Write(d)
	return hex.EncodeToString(m.Sum(nil))
}

处理完后用strings拼接字符串就行。

3. 处理返回数据

这里也有坑,坑在gzip压缩上。响应标头里面说明了数据压缩类型

Connection: keep-alive
Content-Encoding: gzip
Content-Type:application/json;charset=utf-8

不能像给的例程一样直接获取到数据,需要再加一道处理。

        gr, err := gzip.NewReader(resp.Body)
        defer gr.Close()
	if err != nil {
		fmt.Println(err.Error())
	}
	var bodyText []byte
	bodyText, _ = ioutil.ReadAll(gr)

4. 输出有效数据

然后根据返回的结构类型输出有效的数据就行。

{
  "translateResult": [
    [
      {
        "tgt": "性能",
        "src": "performance"
      }
    ]
  ],
  "errorCode": 0,
  "type": "en2zh-CHS",
  "smartResult": {
    "entries": [
      "",
      "n. 表演,演出;工作情况,表现;(投资的)业绩;执行,履行;麻烦,苦差事(a performance);艺术上的表现,演技;(汽车的)性能;(语言学)语言表现,言语行为\r\n",
      "adj. 性能卓越的,高性能的\r\n"
    ],
    "type": 1
  }
}

根据获取到的类型重新创建一个结构体,然后输出SmartResult.Entries中的所有项即可

并发编程

使用的是WaitGroup

    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        query(word)
    }()
    go func() {
        defer wg.Done()
        youdao(word)
    }()
    wg.Wait()

也算是成功完成课后作业了,继续加油吧

微信图片_20220507220335.png