一.变量
1.1声明
单变量声明
var v1 int = 1
var v2 = 2
v3 := 3
多变量声明
var v1,v2,v3 int = 1,2,3
var(
v1 int = 1
v2 int = 2
v3 int = 3
)
1.2匿名变量
使用 ” _” 做为占位符
func getName() (string,string) {
return "a","b"
}
name,_:= getName();
fmt.Println(name)
二.常量
2.1声明
常量声明和变量声明基本一致,只是将var变为const
const PI = 3.14
2.2预定常量
预定常量除了true,false还有一个iota
const 出现时候iota为0,以后没出现一次+1
const (
v1 = iota*100; //0*100
v2 = iota*100; //1*100
v3 = iota*99 //2*99
)
如果递增规则不变可以省略不写
const (
v1 = iota*100; //0*100
v2 //1*100
v3 //2*100
)
2.3枚举
以上const声明方式即作为go语言中枚举使用
三.类型
3.1数组
func TestArr() {
var arr [10]int;
arr[1] = 1;
arr[2] = 2;
fmt.Println(arr)//[0 1 2 0 0 0 0 0 0 0]
}
func TestArr2() {
var arr = [10]int{1, 2, 3, 4};
arr[0] = 88;
fmt.Println(arr)//[88 2 3 4 0 0 0 0 0 0]
}
func TestArr3() {
var arr = []int{1, 2, 3, 4};
arr[0] = 88;
//arr[4] = 88;error:index out of range
fmt.Println(arr)//[88 2 3 4]
}
//二维数组
func TestArr4() {
var arr = [][]int{{1, 2, 3}, {1, 2, 3}, {1, 2, 3}};
fmt.Println(arr)
}
3.2数组切片
数组长度定义之后就无法更改,数组切片即是一个可变长度的数组
1.直接创建
mySlice := make([]int, 5) //创建一个初始个数5的切片[0 0 0 0 0]
mySlice := make([]int, 5,10) //创建一个初始个数5的切片,预留10个位置[0 0 0 0 0]
mySlice := []int{}//初始化一个空切片
mySlice := []int{1,2,3}
2.基于数组创建
var arr = [4]int{1, 2, 3, 4};
mySlice := arr[:]//[1 2 3 4]
mySlice := arr[:3]//[1 2 3]
mySlice := arr[3:]//[4]
3.2map
3.2.1初始化
var mymap map[int]string = make(map[int]string);
var mymap = make(map[int]string);
3.2.1删改查
mymap := make(map[string]string);
//赋值
mymap["a0"] = "aaa";
//删除
delete(mymap, "a0");
//查找
value := mymap["a0"];
value,error := mymap["a0"];
四.流程控制
4.1条件语句 if
注意:if语句条件没有括号!!
func test(a int) (bool) {
if a < 5 {
return true
}
return false
}
4.2选择语句switch
注意:
1.不需要写switch
2.只有添加fallthrough才会明确继续执行下一个case
func TestProcess4(num int) {
switch num {
case 1:
fmt.Println("1111")
case 0:
fallthrough
default:
fmt.Println("xxx")
}
}
4.3循环语句
1.普通循环
for i := 0; i < 100; i++ {
sum += i;
}
2.无限循环
for {
sum ++;
if (sum > 1000) {
break
}
}
3.for-range循环
for key, value := range collection {
fmt.Println(key,value)
}
五.函数
5.1.多返回值函数
//正常形式
func fu1() (int, string) {
return 1, "结果";
}
//有名称的返回值
func fu2() (result1 int, result2 string) {
result1 = 1
result2 = "结果"
return result1, result2;
}
//自动返回有名称结果
func fu3()(result1 int, result2 string){
result1 = 1
result2 = "结果"
return ;
}
5.2不定参数
func fu4(arg ... int){
}
//任意类型的不定参数
func fu4(arg ... interface{}){
}
5.3匿名函数
//匿名函数
func fu6(){
add := func(x,y int) int{
return x+y;
}
fmt.Println(add(1,2))//3
}
六.其他
6.1defer
特点
1.defer是在return之前执行的
2.defer先进后出
用处
清理数据,释放锁
举例
func main() {
defer test1();
defer test2();
test3();
}
func test1() {
fmt.Println("执行test1")
}
func test2() {
fmt.Println("执行test2")
}
func test3() {
fmt.Println("执行test3")
}
结果
执行test3
执行test2
执行test1