这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
一、什么是Go语言
Go语言的特点
- 高性能、高并发 具有丰富的多线程标准库
- 语法简单、学习曲线平缓 基于C语言 循环只有for循环
- 丰富的标准库 和python一样具有丰富的标准库,不需要导入第三方库便可实现常用功能,相较第三方库更加的高效稳定。
- 完善的工具链 单元测试调试等工具
- 静态链接 所有编译都是静态连接 便于部署
- 快速编译 编译速度快
- 跨平台 支持交叉编译
- 垃圾回收 和java类似的垃圾回收机制,无需考虑内存的垃圾回收
二、基础语法
2.1 Hello World
main 包是程序的入口包,fmt是输入输出标准库包
package main
import "fmt"
func main(){
fmt.println("Hello,World")
}
2.2 变量类型
go是一门强类型语言 常见类型:
string
int(int8 int16 int32 int64)
float(float32 float64)
bool
变量的声明方式
变量的声明一般使用以下两种方式
var a = 表达式 a的类型被赋予表达式所返回的结果类型 a:= 表达式
:=和=不同,:=用于初始化变量赋值,=用于给已经声明过的变量赋值。若如下面代码中变量a未声明,变量b已经声明,程序在编译后会自动对a进行初始化变量赋值,对b直接赋值。
`` a,b:=表达式
2.3 基础语法
- for 循环 Go语言只有for循环这一种循环语句。for循环有多种形式,其中一种如下所示:
for initialization; condition; post {
// zero or more statements
}
for循环三个部分不需括号包围。大括号强制要求,左大括号必须和post语句在同一行。
initialization语句是可选的,在循环开始前执行。initalization如果存在,必须是一条简单语句(simple statement),即,短变量声明、自增语句、赋值语句或函数调用。condition是一个布尔表达式(boolean expression),其值在每次循环迭代开始时计算。如果为true则执行循环体语句。post语句在循环体执行结束后执行,之后再次对condition求值。condition值为false时,循环结束。
for循环的这三个部分每个都可以省略,如果省略initialization和post,分号也可以省略:
// a traditional "while" loop
for condition {
// ...
}
如果连condition也省略了,像下面这样:
// a traditional infinite loop
for {
// ...
}
这就变成一个无限循环,尽管如此,还可以用其他方式终止循环,如一条break或return语句。 2. if-else语句 正如for循环一样,if语句条件两边也不加括号,但是主体部分需要加。if语句的else部分是可选的,在if的条件为false时执行。
if condition {
// ...
}else{
// ...
}
- switch结构 这里是一个简单的switch的例子:
switch coinflip() {
case "heads":
heads++
case "tails":
tails++
default:
fmt.Println("landed on edge!")
}
每一个case都会对应一个返回结果,Go语言并不需要在每一个case后写break,语言默认执行完case后的逻辑语句会自动退出。
Go语言里的switch还可以不带操作对象,switch不带操作对象时默认用true值代替,然后将每个case的表达式和true值进行比较;可以直接罗列多种条件,像其它语言里面的多个if else一样,下面是一个例子:
func Signum(x int) int {
switch {
case x > 0:
return +1
default:
return 0
case x < 0:
return -1
}
}
这种形式叫做无tag switch(tagless switch);这和switch true是等价的。
像for和if控制语句一样,switch也可以紧跟一个简短的变量声明,一个自增表达式、赋值语句,或者一个函数调用。
break和continue语句会改变控制流。和其它语言中的break和continue一样,break会中断当前的循环,并开始执行循环之后的内容,而continue会跳过当前循环,并开始执行下一次循环。这两个语句除了可以控制for循环,还可以用来控制switch和select语句,如果我们想跳过的是更外层的循环的话,我们可以在相应的位置加上label,这样break和continue就可以根据我们的想法来continue和break任意循环。
-
指针: Go语言提供了指针。指针是一种直接存储了变量的内存地址的数据类型。在其它语言中,比如C语言,指针操作是完全不受约束的。在另外一些语言中,指针一般被处理为“引用”,除了到处传递这些指针之外,并不能对这些指针做太多事情。Go语言在这两种范围中取了一种平衡。指针是可见的内存地址,&操作符可以返回一个变量的内存地址,并且*操作符可以获取指针指向的变量内容,但是在Go语言里没有指针运算,也就是不能像c语言里可以对指针进行加或减操作。
-
数组slice
//构建,slice可以无限制扩容。
var a []int{1,2,3}
b:= []string{"222","2333"}
//索引
fmt.println(a[0])
//切片,区间为左闭右开
c:=a[1:len(a)]
- Hashmap
//构建一个key为string,value为int的哈希表
map1 := make(map[string]int)
map2 := map[string]int{"one": 1}
var map3 = map[string]int{"one": 1}
//存入
map1["one"] = 1
map1["two"] = map1["two"]+2 //若哈希表key中无"two",会返回value的默认值,类似于JAVA的getOrDefault()方法
//删除
delete(map1,"one")
- range
//遍历map
for k,v :=range map{
//..
}
//遍历slice
for i,v :=range a{
//i:索引
//v:数组中存放的元素
//如果循环体内不对索引或者数值进行操作,可以用_代替,否则不使用的局部变量不能通过编译。
}
- 函数
func 函数名(参数1 类型,参数2 类型)(返回参数 类型){
return
}
- 结构体
type user struct{
name string
password string
}
//结构体方法
func (u user) checkPassword(password string) bool{
return u.password == password
}
//结构体方法调用
var user1 user{
name: "111",
password: "123"
}
user1.checkPassword("123")//true