这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
基础语法
1.变量的声明方式
①var 变量名=变量值;
隐式表达:var a="initial";(自动推导变量类型)
显式表达:var b int=2;
②变量名 := 变量值
f :=float32(e)
2.常量的表达方式
与变量的声明方式类似,将var改为const
3.if-else
①if后的判断条件无括号(),若加了括号,编译器会忽略括号内的内容
②if后的执行语句必须加中括号{}
if 7%2==0 {
fmt.Println("7 is even")
}
4.循环
只有唯一的一种 for 循环
同if-else,判断条件无括号,执行语句必须加中括号
for {
fmt.Pringln("loop")
break;//死循环
}
for j:=7;j<5;j++{//三段中任意一段均可省略
fmt.Pringln(j)
}
5.switch
①switch后的判断变量无需括号,支持各种类型的变量;
②switch中的case语句无需加break语句截断
switch a {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
default:
fmt.Println("default")
}
③switch后可不跟判断变量,在case中撰写条件,实现if-else的功能;
switch {
case a<12:
fmt.Println("<12")
default:
fmt.Println(">=12")
}
6.数组
固定长度
var a[5] int//声明
a[4]=100//赋值
fmt.Println(a[4],len(a))//打印第四个值
b:=[5]int{1,2,3,4,5}//声明与赋值
fmt.Println(b)//打印
7.切片slice
①长度可变,可在任意时刻修改长度;
②声明:s:=make([]string,3) (3定义的值为切片长度)
赋值:s[0]="a"
复制:
c:=make([]string,len(s))
copy(c,s)
打印:
fmt.Println("get",s[2])//打印s[2]
fmt.Pringln("len",len(s))//打印切片长度
fmt.Println(s[2:5])//取出s中第2、3、4个元素
fmt.Println(s[2:])//取出s中第2个元素及其后面所有元素
fmt.Println(s[:5])//取出s中第5个元素及其前面所有元素
增加元素:s=append(s,"d","e")
!注意:append后的结果必须赋值给原数组才能完成增加元素的操作。因为在 Golang中,切片是一个储存了长度、容量和指向数组的指针的抽象数据结构,在 append时,如果容量不够,则将进行扩容操作,返回一个新的 slice,故而需要将结果赋值给原 slice
8.map
在其他语言中,类似地有哈希、字典,是一种常用的数据结构
①声明:m:=make(map[string] int)
map的声明需要两种数据类型,用方括号括起的为 key的数据类型,后者为 value的数据类型,key和 value一一对应,构成 k-v对
②赋值:m["one"]=1
③打印:fmt.Println(m) fmt.Println(m["one"])
④删除:delete(m."one")
⑤用ok来判断map中是否存在k-v对
r,ok:=m["unknown"]
fmt.Println(r,ok)//打印结果:0 false
⑤k-v对在map中的顺序是无序的,在遍历时不会按照字母顺序或插入顺序进行,而是随机地进行遍历
9.range
一种遍历slice和map的方法
10.函数
func 函数名(参数名 参数类型,...) 返回类型{}
①返回类型后置
②返回类型可有两个
func exists()(v string,ok bool)
11.指针
传入类型为指针类才可同步修改传入的变量,在调用传入时也应加上&符号匹配类型
func add2ptr(n *int){
*n +=2
}
//main函数中调用
n:=5
add2ptr(&n)//类型匹配
12.结构体
一个含有多字段的集合
①定义
type user struct{
name string
password string
}
②初始化
显示初始化时可以只赋值一部分字段,剩余字段将默认初始化为空;隐式初始化则必须赋值所有字段,按顺序赋值
a:=user{name:"wang",password:"1234"}
b:=user{name:"wang"}
c:=user{"wang","1234"}
③赋值
c.name="liu"
④定义方法
结构体的方法类似于其他语言中的类成员函数,在func后写上(变量名 结构体类型)即可将其声明为结构体的方法
不带指针:
func (u user)checkPassword(password string) bool{
return u.password==password;
}
带指针 可修改结构体
func (u *user)resetPassword(password string){
u.password=password
}
13.错误处理
使用前需import"errors"
无错误 return nil
有错误 return nil,errors.New("错误原因")
!若有错误处理,需用判断语句确保在无错误的情况下对其他变量进行操作
14.字符串操作
使用前需import"strings"
15.字符串格式化
16.json处理
17.时间处理
18.数字解析
三个参数分别代表(须解析的字符串,字符串进制(0则自动识别),解析结果的精度)