这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
Go语言简介
Go语言具有以下特点:
- 高性能,高并发
高并发的含义:高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
- go语言使用协程(goroutine)来处理高并发,它比线程更轻量级,更易用高效,可以同时运行上万个并发任务。
- 语法简单,学习曲线平缓:go语言可以快速上手,语法相比其他语言更加简单
- 丰富的标准库:go语言项目不需要依赖特别多第三方库,具有丰富的标准库
- 完整的工具链
- 静态链接
- 快速编译:go语言的编译速度和运行速度相较其他语言都十分优秀
- 跨平台:go语言支持windows,mac,Linux等多种平台
- 垃圾回收机制:无需考虑内存的释放
- 此外,go语言还具有交叉编译特性,在实现某些项目时,无需配置交叉编译环境
Go语言基本语法
变量声明:
- 方法一:声明一个整型变量,默认值是0
var a int fmt.Println("a=", a) - 方法二:声明一个变量,初始化一个值
var b int = 100 var bb string = "1234" fmt.Println("b=", b) fmt.Printf("bb=%s,type of bb =%T\n", bb, bb) - 方法三:在初始化的时候可以省去数据类型,通过值自动匹配当前变量的数据类型(不推荐)
var c = 100 var cc = "1234c" fmt.Println("c=", c) fmt.Printf("type of c=%T\n", c) fmt.Printf("cc=%s,type of cc =%T\n", cc, cc) - 方法四:(常用的方法)省去var关键字直接自动匹配
e := 100 fmt.Printf("type of e=%T\n", e) g := 3.14 fmt.Printf("type of g=%T\n", g)
if-else语句
区别于java或者c语言等,if后面接的表达式不可以带小括号。
循环
golang中只有for循环一种循环。若for后无表达式,则表示一个死循环。
switch-case语句
不同于c语言,case语句下面不需要跟break
数组和切片
数组的定义:
var myArray1 [10]int
myArray2 := [10]int{1, 2, 3, 4}
切片slice的定义:
- 方式一:
slice1 := []int{1, 2, 3, 4} - 方式二:定义slice2为一个切片,但没有分配空间,也不能赋值(会报越界错误)
var slice2 []int //下面给slice2开辟空间 slice2 = make([]int, 3) - 方式三:同时开辟空间
var slice3 []int = make([]int, 4) - 方式四:常用方式
slice4 := make([]int, 5)
切片扩容机制:切片扩容机制:如果append的时候长度超过容量,容量增加为原来的两倍 下面为演示的例子:
func main() {
//定义一个长度为3容量为5的切片
var nums = make([]int, 3, 5)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)
//向nums追加元素1
nums = append(nums, 1)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)
//向nums追加元素2
nums = append(nums, 2)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)
/*
此时再追加,len(nums)就为6了,超过了cap=5,数组进行扩容
cap = 2*cap
*/
nums = append(nums, 3)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)
}
切片的截取:
截取到下标0,1的元素:
s1 := s[0:2]
对于slice,copy函数可以将底层数组的slice一起进行拷贝。拷贝后的slice实际和原slice指向的是同一个空间
map
map里存放键值对(key-value),里面存放的数据完全无序。对于map,使用range来遍历更加的快捷易用
函数
- 函数的返回类型是后置的。此外,对于go语言的函数,可以有多个返回值
- 函数的参数中,带指针就可以对它全局的值进行修改;同理,如果是结构体的指针,也可以修改结构体中的值
- defer:在所在函数的最后执行,如果有多个defer,采用类似压栈的方式,先进后出,先写的defer后执行
错误处理:
可以在返回值中加一个error类型,代表是否出现错误。如果没有出现错误,则err=nil
json
可以用unmarshal方法进行反序列化操作
json转golang struct的网站:oktools.net/json2go
实战中踩得一些坑
猜谜游戏不能输入数字:
解决:
curl命令不能执行?
在windows安装crul,然后在cmd里运行crul就可以解决了。