为了扩展的扩展 流程控制 if 1 2 3 4 5 if condition { } else if condition { }
if 后接条件语句(表达式) , 无括号
1 2 3 4 5 6 7 if 9 >8 { } else if 8 >8 { } else { }
for 1 2 3 for expr1; expr2 ;expr3 { }
expr1 为初试化变量语句, 仅执行一次 expr2 为循环条件语句, 每次循环前都会判断其值 expr3 是改变循环变量的地方, 每次循环后执行 其中expr1,expr2,expr3均可省略
另一种是仅留下 循环条件语句 如:
此时 2个分号 也可省略, 即:
啊, 和java的while 多像
1 2 3 4 me := map [string ]string {"name" :"wq" ,"age" :"19" ,"long" :"200" } for k,v := range me { fmt.Println(k,v) }
嗯, 是的foreach(for in) 就是这个feel 尤其提示, 如果不使用 k , 请用_ 替代, 避免编译错误
switch 1 2 3 4 5 6 7 8 switch exp { case 0 : case 1 ,2 ,3 : default : }
对于exp不需要括号 每个case后, 都默认带有break, 不会往下执行 如需执行后面的case,可使用fallthrough 关键字 可以用 , 号分隔代表多个case default就不说了, 类似与if的else
最后写个冒泡排序法复习巩固下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package mainimport "fmt" func main () { slice := []int {3 ,4 ,2 ,9 ,1 ,0 ,88 ,44 ,20 } maopao(slice) fmt.Println(slice) } func swap (slice []int , index1 int ,index2 int ) { temp := slice[index1] slice[index1]=slice[index2] slice[index2]=temp } func maopao (slice []int ) { for i := 0 ; i< len (slice)-1 ;i++ { for j:=0 ; j< len (slice)-1 -i; j++ { if slice[j]>slice[j+1 ] { swap(slice,j,j+1 ) } } } }
99 乘法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package mainimport "fmt" func main () { num, num2 := 1 , 1 for num<=9 { num2 = 1 for num2<=num { fmt.Printf("%d * %d = %d\t" ,num2,num,num*num2) num2++ } fmt.Println() num++ } }
使用了for的完整版 , if 判断 slice指针传递 可变性
函数 func语法 1 2 3 4 func funcName (params...) (returns...) { return ... }
如,无参无返回值
单参数,单返回值
1 2 3 4 func test (id int ) int { return 0 }
多参数, 多返回值
1 2 3 4 5 func test (id int , skills []string ) (int , map [string ]int ) { numbers := map [string ]int {"one" :1 ,"two" :2 ,"three" :3 } return 0 , numbers }
大概就是这些, 写个阶乘玩玩
1 2 3 4 5 6 7 8 9 func jiechen (n int ) int { if n==1 { return 1 } return n * jiechen(n-1 ) } func main () { sum := jiechen(4 ) }
defer延迟 1 2 3 4 5 6 7 func test () { fmt.Println("func code run" ) for i:=0 ; i<8 ; i++ { defer fmt.Println("defer" ,i) } fmt.Println("func code last" ) }
后进先出的队列机制, 逆序输出了 i 延迟执行, 在return之前
import 1 2 3 4 5 import ( . "fmt" _ "fmt" f "fmt" )
用 . 代表无需前缀, 直接调用fmt的方法 用_ 代表不使用fmt的函数, 仅加载 其他名称则为别名 , 如 f.Println()
a func is a type or a value ?? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package mainimport "fmt" func main () { slice := []int {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 } fmt.Println("slice:" ,slice) odd := filter(slice,isOdd) even:= filter(slice,isEven) fmt.Println(odd,even) } type funcType func (int ) bool func isOdd (i int ) bool { if i%2 ==0 { return false } return true ; } func isEven (i int ) bool { if i%2 ==0 { return true } return false } func filter (slice []int ,f funcType) []int { var result []int for _, value := range slice { if f(value){ result = append (result, value) } } return result }
将func作为一个类型, 置于参数中, 由于go也是强类型, 所以需要添加自定义类型 将func作为实参(值)传递给另一个函数, 然后被调用
struct 语法定义 1 2 3 4 type person struct { name string age int }
使用 1 2 3 4 5 6 var p personp.name="wq" p.age = 79 p1 := person{"wq" ,89 } p2 := person{name:"wq" ,age:99 }
匿名字段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 type humen struct { name string age int long int } type Skills []string type person struct { humen int Skills name string phone string } func main () { p := person{humen{"wq" ,39 ,99 },666 ,[]int {"c" ,"java" ,"c#" },"pwq" ,"110" } fmt.Println(p,p.name,p.age,p.long,p.phone,p.Skills,p.int ) }
通过2个struct 实现了类似 继承 通过不给字段名,仅给字段类型定义一个匿名字段 可直接访问匿名字段, 但可能覆盖匿名字段中的字段 匿名字段 还可以为 自定义类型, 基础类型 , slice, map, array等