这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一、本堂课重点内容:
- 第一节课,概览了go的基础用法.
- 第二节课,三个硬核的go例子,不愧是字节
二、详细知识点介绍(第一节课):
*第一节课对于我来说是查漏补缺,复习巩固.有些函数仅列出名字,建议在golang里直接看源码和注释.
-
安装go,两步
- 1.下载go
- 2.下载IDE
- 配置goproxy(即换源 goproxy.cn)
- 集成开发环境我选择了goland,但是确实太吃内存,未来考虑换回vscode.
-
基础语法
-
变量: go是一种强类型语言,每个变量都有自己的类型.变量的声明有两种方式:
-
1.关键字声明:
- (1) 使用var/const可以声明变量和常量;
- (2) 声明时可以赋初值,如果不赋初值,就是对应变量的0值(int:0,string:"",bool:false...);
- (3) 赋初值的时候可以不指定类型,也可以指定.
-
2.':='符号声明:
- (1) 那么必须要赋值;
- (2) 确实更加方便.
-
-
if-else:类似于c的写法,但是不用'( )'包裹条件.
-
for:golang只有for一种循环,同样不需要'( )'包裹条件. 循环条件写法有:
- 1.不写,就是死循环
- 2.只写条件,类似于其它语言的while
- 3.循环变量;条件;更新
- 4.range关键字:
- key,value:=range XXX
-
switch:相比于c语言:
- 1.默认执行完case就跳出,不用加break.
- 2.如果要不break反而要加关键字.
- 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true
- 3.case里可以写完整的条件表达式,而switch为空,所以可以替代if-else.
-
数组
- 声明:
- 法一: var a [4]int
- 法二: a:=[4]int{1,2,3,4}
- 声明:
-
切片
- 声明:
- make([]type,len,cap)
- append:在slice后面追加元素
- 声明:
-
map
- 声明:make(map[key]value)
- 对于访问未知的key,会返回对应value类型的0值
- delete(map,keyName) 删除键值对
-
range
- 语法糖,可以方便的便利slice和map (struct不行!).
- for i,v:=range XXX{...
-
函数
- func funcName(args types)(return){...
- 函数是go中的一等公民
-
指针
- 用法很单一,只能用于传参,不能运算.
-
结构体
- 结构体+方法 就是go的"对象"
-
出错处理
- if err!=nil{...
-
字符串操作:在strings包里
- Contains("Hello","ll") //true
- Count("Hello",l)//2
- HasPrefix("Hello","He")//true
- HasSuffix("Hello","lo")//true
- Index("Hello","ll")//2
- Join([]string("He","llo"),"-")//He-llo
- Repeat("Hello",2)//HelloHello
- Replace("Hello","l","L",1)//HeLlo
- Split("a.b.c.d",".")//[a,b,c,d]
- ToLower("Hello")//hello
- ToUpper("Hello")//HELLO
-
格式化:
- %v 打印值
- %+v 打印键值
- %#v 打印类型+键值
-
json:
- 序列化和反序列化,略
-
时间: 模板为"1月2日下午3点4分5秒在06年"
- 常用:
- 得到时间变量t: time.Now() time.Date(...) time.parse(...)
- t.Year(),t.Month(),t.Day(),t.Hour(),t.Minute()
- 得到时间段diff: t.sub(t2)
- diff.Minutes(),diff.Seconds()
- 常用:
-
数字解析: 在strconv包里
- 常用方法: ParseFloat,ParseInt,Atoi
-
进程信息:
- 常用方法:os.args,os.getenv,os.setenv,exec.command
-
三、实践练习例子(第二节课):
- 1.猜数字
- 作业一
- 2.翻译引擎
- 作业二
- 作业三
- 3.socks5代理
作业1
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("Please input your guess")
for {
var guess int
if _, err := fmt.Scanln(&guess); err != nil {
fmt.Println(err)
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
}
}
}
作业3:复刻一个单词查询,我选择的是江沪英语(实际上就是百度的引擎).然后开两个goroutine,用waitgroup优雅地等待即可.我把两个引擎封装在了两个不同的包里面.代码量太大,我就不展示了,跟着视频一步一步做就行.
func main() {
if len(os.Args) != 2 {
fmt.Println("只能输入一个查询词!")
return
}
word := os.Args[1]
wg := sync.WaitGroup{}
wg.Add(2)
go huEngine.HuQuery(word, &wg)
go caiyunEngine.CaiYunQuery(word, &wg)
wg.Wait()
}
$go run simpledict/v5/main.go happy
------彩云结果------
happy UK: [ˈhæpi] US: [ˈhæpɪ]
a.快乐的;幸福的;满意的;适当的;得体的;乐意的
------江沪结果------
happy 快乐的
四、课后个人总结:
- 本章有什么知识点不容易掌握?
- 第二节课的内容比较难,需要一些基础才能跟上,尤其是第二第三个例子学到了很多新东西.
- 其次,老师讲课中的工具在我的电脑上有点异常,copy as cURL在我这会有很多'^'的乱码要手动清除.
- 什么地方容易与其他内容混淆?
- 暂无.
五、引用参考:
- 我参考了哪些外部博客/笔记/文章?
- 文章中有什么地方是我参考引用了外部博客/笔记/文章的?
- 暂无