这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
基础结构
package main
import "fmt"
func main() {
fmt.Println("Google" + "Runoob")
}
需要注意:
- 包名和文件名/文件夹名没关系
- 一个文件夹下面只能有一个包
{不能单独放在一行
不同与Java书写习惯
- 声明变量可以省略类型,使用
var关键字,有简洁写法:=,常量根据上下文自动确定类型 if和for后面都没有()括号-
- 都用
for关键字,没有while循环
- 都用
switch的case中不用加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相关参数设置好就行
2. 创建提交表单数据
在测试的时候会发现,有道的sign,slat,lts参数是动态的,每次请求不同
请求1 salt=16519486483658&sign=e1b05f3c009c2aa3fb8bb8732a0b5be5<s=1651948648365
请求2 salt=16519472230688&sign=81b65be634f2c6b404498fa812fa0035<s=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是指查询的单词,i是salt,r是lts
实现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()
也算是成功完成课后作业了,继续加油吧