这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。 今天主要学习了Go语言课程的第一节和第二节。
一、本堂课重点内容:
- go语言的开发环境搭建
- go语言的基础语法
- go的简单实战案例--猜数游戏、网络辞典、SOCKS5简单服务搭建
二、详细知识点介绍:
-
本堂课介绍了哪些知识点?
- 使用fmt进行基本输出
import ( "fmt" ) func main() { fmt.Println("hello world") }熟悉任何一门语言,首先要学会其基本的输出。go常用fmt工具包进行基本输出,可以进行格式化输出和,也可以输出后换行。
-
变量的定义 var关键字 :=自动推断
变量的定义尝尝可以自动推断,如
a:=1或var a int =1go语言的变量定义后必须使用否则报错
-
go语言的结构控制 for if switch关键字
go语言没有while关键字,可以用for{}来实现,for后紧跟着条件则与普通用法一致,否则代表死循环。
if条件语法简洁,没有圆括号,else要紧跟上一个if的花括号后面。
-
三种常用数据结构 array、slice、map
array生成后大小不可变(go是静态强类型语言)
slice可变大小(类似c++ vector)可以用make底层创建一个数组,对外不可见,所以不可以直接操作这个数组,要通过slice去间接的访问各个元素,不可以直接对数组进行维护/操作。
map是Go语言中内置的一种类型,它将键值对相关联,我们可以通过键
key来获取对应的值value。 类似其它语言的HashTable、set -
遍历数组 for range
for key, val := range coll { ... }
其中coll是array、slice、map一类
-
函数的定义 func
驼峰命名
func 函数名(形参列表)(返回值类型列表){
执行语句..
return + 返回值列表
}
函数不支持重载
Golang中支持可变参数
在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。
函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
-
指针类型
*声明指针
&取地址
-
结构体与常用的结构体操作
名字大写可以从外部访问 json可以附加小写名
-
错误控制 errors库
引入机制:defer+recover机制处理错误 可以new一个error
-
json操作
json.Marshal() json.Unmarshal()转换字符与json -
time操作
time.Now()
now.Year()
now.Month()
now.Day()
-
字符串操作
atoi itoa
strings.Contains("javaandgolang", "go")
strings.Count("javaandgolang","a")
strings.EqualFold("go" , "Go")
strings.lndex("javaandgolang" , "a")
strings.Replace("goandjavagogo", "go", "golang", n)
strings.Split("go-python-java", "-")
strings.ToLower("Go")
strings.ToUpper"go")
strings.TrimSpace(" go and java ")
strings.Trim("
golang", " ~")strings.HasPrefix("java.sun.com/jsp/jstl/fm…", "http")
strings.HasSuffix("demo.png", ".png")
-
goenv以及命令行传递参数
os.Args os.Getenv("PATH") os.Setenv("AA", "BB")
三、实践练习例子:
- curlconverter.com/go/ 这个网站可以讲curl请求转换成go的请求。
- [JSON转Golang Struct - 在线工具 - OKTools]这个网站可以将json格式的数据转换成go语言的结构体。
1.修改第一个例子里的最终代码,使用fmt.scanf实现
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")
var guess int
for {
fmt.Scanf("%d", &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
}
}
}
2.课后第二题,添加一个搜索引擎 使用百度引擎。
根据这个页面,按照课上步骤进行爬取即可得到结果
3.课后第三题 可以使用 goroutine 和 channel 来实现同时请求两个网站并在一个请求完成时结束另一个函数。
首先,可以在两个函数中分别开启一个 goroutine,这样就可以同时请求两个网站。然后,可以在两个函数中分别创建一个 channel,用来通信请求是否完成。最后,在主函数中使用 select 语句监听两个 channel,当一个 channel 中有数据时,说明对应的请求已经完成,此时就可以结束另一个函数。
func main() {
var word string
done1 := make(chan bool)
done2 := make(chan bool)
fmt.Scanf("%s", &word)
go query_bd(word, done1)
go query(word, done2)
select {
case <-done1:
fmt.Println("baidu done")
break
case <-done2:
fmt.Println("caiyun done")
break
}
//PS:分别在两个请求函数内部添加了done<-true的语句
}
测试
//在彩云的请求里添加后测试
time.Sleep(time.Second*5)
测试结果是彩云比百度快!
四、课后个人总结:
- 我本节课的socks5那个案例学的不好,需要多实践几次加深理解。