变量的声明
方式一:
例:var a = "initial"
通过这种方式,会自动推导变量类型
也可以显式给出变量类型
例:var b,c int = 1,2
方式二:
例:i := 1
if
if后面的条件不需要加括号,但是对应的代码块必须用大括号{}包裹
循环
和C++、Java不同,Go语言里面只有for循环
方式一(无限循环):
for {
fmt.Println("loop")
break;
}
方式二:C语言风格
for j := 7; j < 9; j++ {
fmt.Println(j)
}
其中的初始化语句j := 7、条件判断语句j < 9、条件控制语句j++三项都可以省略
switch
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")
}
不同于C/C++,这里执行完a对应的case分支就会跳出switch,无需额外加break来达到目的
相比C/C++,功能更加强大,case后面可以加字符串、结构体
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")
}
数组
数组的声明
方式一:var a [5]int
二维数组:var twoD [2][3]int
方式二:b := [5]int{1, 2, 3, 4, 5}
切片
切片是一个可变长度的数组
切片的声明
方式一:s := make([]string, 3)
方式二:good := []string{"g", "o", "o", "d"}
切片也能像一般的数组那样赋值:
s[0] = "a"
可以用len函数获取切片长度:
fmt.Println("len:", len(s))
用append函数往切片里添加元素:
s = append(s, "d")
用copy函数拷贝切片:
c := make([]string, len(s))
copy(c, s)
可以取切片指定位置的元素:
fmt.Println(s[2:5])
map
声明方式:
m := make(map[string]int)
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
在这里,key的类型为string,value的类型为int
map可以像数组那样赋值,这里的数组下标就是map的key,数组下标对应的值就是map的value
map是无序的,不会按照字母顺序/插入顺序来遍历
range
range遍历的时候,会返回两个值
对于数组,第一个值是索引,第二个值是对应位置的值,如果不需要索引的话,可以用_来忽略
对于map,第一个值是key,第二个值是value
函数
在函数的参数里,依然延续了Go的语法特点:变量类型是后置的
Go的函数原生支持返回多个值
指针
相比C/C++,支持的操作非常有限,Go指针的主要用途是在函数里对传入的参数进行修改
结构体
定义方式:
type user struct {
name string
password string
}
初始化:
a := user{name: "wang", password: "1234"}
b := user{"wang", "1024"}
c := user{name: "wang"}
没有初始化的字段,对应的值为空值
使用结构体指针作为函数的参数,既能对指针指向的结构体进行修改,又能在某些情况下避免大结构体拷贝带来的开销
结构体方法
类似于其它语言的类成员函数
字符串操作
Go语言提供了一系列的字符串操作函数,如:
Contains:判断一个字符串是否包含参数中指定的字符串
Count:判断一个字符串里包含了多少个参数中指定的字符串
Index:查找参数中指定的字符串首次出现在源字符串的哪个位置
Join:用指定字符串将多个字符串连接起来
Repeat:将某个字符串重复拼接