第一节课【Go 语言上手-基础语言】
这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
基础语法
var声明变量
var (变量名) (变量类型)
var a,b int //多个相同类型变量,可只在最后写一个类型
快速声明赋值
(变量名) := (某类型的值,如"school",true,98,函数返回值)
变量会自动检测类型并赋值
for循环
Go只有for一种循环,但它有多种形式
形式一:
for i := 0; i < count; i++{}
for ; (条件); {}
形式二:(简化去除了两边的分号,相当于while循环)
for (条件) {}
形式三:(类似java的迭代循环)
for a := range(数据集) {}
switch语句
Go的switch语句有两种形式
形式一:以a值逐个匹配case值,匹配成功则执行其的效果,匹配失败则执行default
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
形式二:switch后不跟随变量,在case中填写表达式,表达式为真则执行效果,类似于if-else
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
Go的switch-case语句不会在匹配到相应的case并执行结束后,顺序执行之后的case,所以也不需要在每个case的最后添加break语句
数组
var (变量名) [容量](数据类型)
var a [5]int
b := [5]int{1, 2, 3, 4, 5}
切片
相当于变长数组
s := make([]string, 3) //初始长度3,如果append时不够会自动扩容 make方法为其分配内存,类似new
map
即哈希表,在其中存储的数据没有顺序
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0(不存在相应的key则输出int的默认值,为0)
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
指针
Go的指针基本上都作为函数的传入参数来使用,目的是为了在函数中直接更改目标的值,而不是只更改目标的copy值
func add2(n int) {
n += 2
}
func add2ptr(n *int) {
*n += 2
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n) //传入指针需要在变量左边加上 "&" 符号
fmt.Println(n) // 7
}
函数
声明
func [名 结构体] (方法名)([名 类型]) 返回值类型 {}
func (u user) checkPassword(password string) bool {
return u.password == password
}
返回值
Go的函数可以有不止一个返回值,返回时直接可以直接用 := 来接收返回值,不需要的返回值可以以 _ 接收
如 _, err := xxxx()
许多Go函数都具有不止一个返回值,其中一个就是error(错误信息),当没有错误时,err会返回nil
实战项目
命令行字典
要实现命令行字典,需要借用外部网站的翻译功能,首先在外部网站通过F12开发者模式抓取包含翻译目标的、请求方法为 "POST" 的请求包(如彩云小译中为 "dict" 包)
然后右键包,复制,复制为cURL(bash),再在工具网站(curlconverter.com/#go)上粘贴,使其成为一段与其请求功能相同的代码
在包的 "预览" 中复制相应json值,在另一工具网站(oktools.net/json2go)上粘贴,使其变为我们用来接收请求网站返回数据的相应结构体
然后修改代码,修改传入的data字段,使我们能输入任何我们想查询的单词,修改输出的方法,使其有选择的输出我们想要的字段