这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。
1.什么是Go语言
Go(又称Golang)是Google的Robert Griesemer,Rob Pike及Ken Thompson开发的一种静态强类型、编译型语言。 Go语言语法与C相近,但功能上有:高性能、高并发、丰富的标准库、完善的工具链快速编译、支持跨平台、GC(垃圾回收)。
2.1入门
1.安装Golang 2.配置集成开发环境(可以选择VSCode or Golang)
2.2基础语法-Hello World
首先我们来看Go语言的helloworld
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
第一行package main表示这个文件包属于main包的一部分,main包也就是程序的入口包(或许和C的main函数类似)
第三行导入了标准库里面的fmt包。这个包主要用来往屏幕输入字符串、格式化字符串。(ps:可以通过按住ctrl然后点击包名称来查看这个包中有哪些内容)然后就是main函数,其中调用了fmt.Println()输出Hello World。
要运行这个程序的话,就直接在terminal输入go run helloworld.go。或者可以输入go build来进行二进制编译之后直接/helloworld就可以运行。
2.2基础语法-变量
常见的变量类型
1.字符串
2.整数类型
3.浮点型
4.布尔型
然后我们再看一段实例代码
package main
import (
"fmt"
"math"
)
func main(){
var a="initial"
var b,c int =1,2
var d=true
var e float64
f:=float32(e)
g:=a+"foo"
fmt.Println(a,b,c,d,e,f)
fmt.Println(g)
const s string="constant"
const h=500000000
const i=3e20/h
fmt.Println(s,h,i,math.Sin(h),math.Sin(i))
}
其中揭示了变量的两种声明方式:
1.通过var name string这种方式来声明
var b,c int
2.使用变量:=等于值
g:=a+"foo"
区别在于第二种只能在函数体内使用,而第一种可以在函数体外使用。
另:常量的声明就是把var改为const,而且Go语言的常量不像C一样有确定的类型如:const int等,会根据上下文来自动确定类型。
2.3基础语法-if else
上代码
package main
import "fmt"
fuc main(){
if 7%2 ==0{
fmt.Println("7 is even")
}else{
fmt.Println("7 is odd")
}
if num := 9;num<0{
fmt.Println(num,"is negative")
}else if num < 10 {
fmt.Println(num,"has 1 digit")
}else{
fmt.Println(num,"has multiple digits")
}
}
Go语言里的if else写法和C或者C++类似,只不过if后没有括号,并且Golang里面的if后必须加大括号不能把语句都放在if同一行。(就算你加了括号也没大问题因为编译器编译的时候会自动去掉的)
2.4基础语法-循环
package main
import "fmt"
fuc main(){
i := 1
for{
fmt.Println("loop")
break
}
for j := 7; j < 9: j++{
fmt.Println(j)
}
for n := 0; n < 5; n++{
if n%2 ==0{
continue
}
fmt.Println(n)
}
for i < 3 {
fmt.Println(i)
i = i + 1
}
}
Go语言没有while循环、do while循环,只有for循环。最简单的for循环就是for{},也代表一个死循环。循环中你同样可以像C语言一样用break跳出,或者是用continue继续下一次循环,同样你可以像C语言一样写一个经典的for i :=0; i < N;i++{},其中三个同样的也是任意一个都可以省略。
2.5基础语法-switch
和C与C++类似同样switch后的那个变量名不需要括号。最大的不同就是Go语言的switch case自带break,并不会跑完所有的case。并且Go语言的switch功能更强大,可以使用任意的变量类型,甚至可以用来取代if else语句,在switch后面不加变量直接在case中写条件分支,这样代码逻辑会更加清晰。
2.6基础语法-数组与切片
数组的定义和变量类似如:var A[5] int就定义了一个可以存放5个int元素的数组A。但其实相对于数组,更常用到的是切片。
且脾气呢不同于数组,其长度是可变的,有更多操作。 比如:s := make([]string,3)这样就创建了一个可以存放三个字符串元素的切片s然后我们可以通过append来追加元素或者用delet来删除元素。同时Go的切片也有像python一样的切片操作,如s[2:5]代表取出第二个到第五个位置的元素,不包括第五个元素,不过和python不同的是不支持负数索引。
2.7基础语法-map
map是实际使用过程中最频繁用到的数据结构,我们可以通过m := make(map[string]int)创建一个空map,这里用到了两个类型一个是key的类型,在这里是[]中的string,另一个是value的类型,这里是外面的int,我们可以向其中储存这样的键值对,也可以用delet删除其中的键值对,并且Golang的map是无序的,输出与遍历是随机的。
2.8基础语法-函数
Golang和其他语言最大的不同就是变量类型是后置的,同时函数支持返回多个值,因此实际应用中几乎所有代码中函数都返回两个值,一个结果,一个错误信息,方便排除故障。
3.1实战-guessing game
简单的猜数游戏,需要注意range使用时需要导入time包加上时间戳,这样才能生成不一样的随机数。
3.2实战-simpledict
在线字典的实现,注意整个抓包的流程,以及注意要对可能产生的错误信息进行处理。(第一次接触的话需要下点功夫 比如我)
3.3实战-proxy
完全没接触过,听得云里雾里,还是不懂捏
明天再看看视频温习一下,再去看看Github上的代码揣摩一下思路。
总结 今天是字节青训营的第一天,学习了一些Golang的基础语法,其实很多内容和C++类似,可以触类旁通,三个实战项目难度逐渐加大,从第一个项目的完全理解,到第三个的云里雾里,我明显感觉到了自己和大佬的差距,还需要更加努力学习呀。