控制语句
if-else
if (true && true) { fmt.Print("hello") return } 复制代码
注意格式,这种写法是不被允许的,需要将第一个左括号放到if
的同一行
goto
写法如下:
func myfunc() { i := 0 Here: ← 这行的第一个词,以分号结束作为标签 println(i) i++ goto Here ← 跳转 } 复制代码
标签大小写敏感
for
写法分成三种
第一种:一般的for循环
var i = 5 Tag: if i == 0 { return } for i := 0; i<10 ; i++ { fmt.Println(i); } i-- goto Tag 复制代码
第二种:相当于while
var z = 6 for z > 5 { z++ if z > 7 { break } print("hello wolrd") } 复制代码
第三种:表示死循环
for { ..... } 复制代码
注意下面的写法是固定的,不能使用逗号表达式,只能使用平行赋值的方式
for i, j := 0, len (a)-1 ; i < j ; i, j = i+1, j-1 { a[i], a[j] = a[j], a[i] ← 平行赋值 } 复制代码
注意GO 里面是没有while语句的
只能使用for进行书写while的循环
range
list := []string{"aaa", "vvv", "ccc", "ddd", "eeee"} for k,v := range list { print(k, "-", v) } 复制代码
上面的例子是如下运转的:
- k 表示为 下标, v为值, range 代表了迭代器
- 迭代元素从 0 到 4 ,元素从 aaa...eeee 迭代
switch
switch非常的灵活,可以在case里面写上表达式
func unhex(c byte ) byte { switch { case '0' <= c && c <= '9': return c - '0' case 'a' <= c && c <= 'f': return c - 'a' + 10 case 'A' <= c && c <= 'F': return c - 'A' + 10 } return 0 } 复制代码
它不会匹配失败后自动向下尝试,但是可以使用 fallthrough 使其这样做
switch i { case 0: fallthrough case 1: f() // 当 i == 0 时, f 会被调用! } 复制代码
还可以使用下面这张写法,逗号分隔多个条件
case ' ', '?', '&', '=', '#', '+': ← , as ”or” return true } 复制代码
内建函数
网络异常,图片无法展示
|
array、slices 和 map
array
var arr = [3]int{} for item := range arr{ print(item); } ss := [...] int{1,2,2,3,4,4} // 初始化 a := [3] int{ 1, 2, 3} ff := [3][2] int { { 1,2 } , { 3,4 } , { 5,6 } } bb := [3][2] int { [2] int { 1,2 } , [2] int { 3,4 } , [2] int { 5,6 } } print(a, bb, ss); 复制代码
slices
slice
总是指向底层的一个 array
总体来说go的语法基本和java相符,但是部分内容需要小心对待,个人不是很爽go语言的部分奇葩语法
slice 总是与一个固定长度的 array 成对出现。其影响 slice 的容量和长度
slice: slice := array[0:n]
对比图;
网络异常,图片无法展示
|
扩展 slice
append
和 copy
函数 append
向slice s
追加零值或其他 x
值,并且返回追加后的新的、与 s 有相同类型的slice
s0 := [] int { 0, 0 } s1 := append (s0, 2) //追加一个元素, s1 == []int{0, 0, 2} ; s2 := append (s1, 3, 5, 7) //追加多个元素, s2 == []int{0, 0, 2, 3, 5, 7} ; s3 := append (s2, s0...) // 追加一个 slice, s3 == []int{0, 0, 2, 3, 5, 7, 0, 0} 。注意这三个点! 复制代码
函数 copy 从源 slice src 复制元素到目标 dst ,并且返回复制的元素的个数。
var a = [...] int { 0, 1, 2, 3, 4, 5, 6, 7 } var s = make ([] int , 6) n1 := copy (s, a[0:]) ← n1 == 6, s == []int{0, 1, 2, 3, 4, 5} n2 := copy (s, s[2:]) ← n2 == 4, s == []int{2, 3, 4, 5, 4, 5} 复制代码
map
案例:
monthdays := map [ string ] int { "Jan": 31, "Feb": 28, "Mar": 31, "Apr": 30, "May": 31, "Jun": 30, "Jul": 31, "Aug": 31, "Sep": 30, "Oct": 31, "Nov": 30, "Dec": 31, ← 逗号是必须的 } 复制代码
只做声明的时候:monthdays := make ( map[ string ] int )
如何使用: monthdays["Dec"]
for _, days := range monthdays { ← 键没有使用,因此用 _, days year += days } 复制代码
检查元素是否存在
var value int var present bool value, present = monthdays["Jan"] ← 如果存在, present 则有值 true ← 或者更接近 Go 的方式 v, ok := monthdays["Jan"] ← “逗号 ok ”形式 复制代码
练习
Q1. (0) For-loop
- 创建一个基于 for 的简单的循环。使其循环 10 次,并且使用 fmt 包打印出计数
器的值。 2. 用 goto 改写 1 的循环。关键字 for 不可使用。 3. 再次改写这个循环,使其遍历一个 array,并将这个 array 打印到屏幕上。