go 基础 -1
变量声明
-
// var 变量名 变量类型 var name string
-
// 批量声明 var ( a string b int )
-
// 初始化 var 变量名 类型 = 表达式 // 一次初始化多个 var a, b = 1, 2
-
// 变量推导,可以省略类型,根据右边定义的值自动推导类型 var a = 123
-
// 短变量声明,一般用于函数内部,不能在函数外使用 a := 100
-
// 匿名变量,用 _ 表示 用于获取多个值时忽略某个值 package main import "fmt" func qwer() (int, string) { return 1, "haha" } func main() { a, _ := qwer() _, b := qwer() fmt.Println("a=", a) fmt.Println("b=", b) }
常量
-
// const 常量名 = xxx const a = 1
-
// 多个常量 const ( b = 12 c = 34 ) // const同时声明多个常量时,如果省略了值则表示和上面一行的值相同 const ( d = 12 e )
iota
iota
是go语言的常量计数器,只能在常量的表达式中使用
-
//
iota
在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota
计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。
const ( a = iota // 0 b // 1 ) const c = iota // 0 -
// demo1 使用 _ 跳过某些值 const ( n1 = iota //0 n2 //1 _ n4 //3 ) // demo2 iota声明中间插队 const ( n1 = iota //0 n2 = 100 //100 n3 = iota //2 n4 //3 ) /* demo3 定义数量级 (这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8。) */ const ( _ = iota KB = 1 << (10 * iota) MB = 1 << (10 * iota) GB = 1 << (10 * iota) TB = 1 << (10 * iota) PB = 1 << (10 * iota) ) // demo4 多个iota定义在一起 const ( a, b = iota + 1, iota + 2 //1,2 c, d //2,3 e, f //3,4 )
if
if 表达式1 { 分支1 } else if 表达式2 { 分支2 } else{ 分支3 }
// demo1
func main() { score := 65 if score >= 90 { fmt.Println("A") } else if score > 75 { fmt.Println("B") } else { fmt.Println("C") } }
// demo2
func main () {
if score := 65; score >= 90 {
fmt.Println("A")
} else if score > 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
demo1和demo2的区别在于score变量,demo1的score变量能在if判断完后继续使用,demo2的score只有在进行到判断那一步时才能使用,假如score用完就不需要了,可以使用demo2的写法。反之,则使用demo1的写法
for
for循环在返回true时,不停的循环,直到返回false就自动退出停止
for 初始语句;条件表达式;结束语句{ 循环体语句 } 写法一: for i:=0; i<10; i++{ fmt.Println(i) } 写法二:忽略初始语句,但分号(;)还要保留 i := 0 for ; i<10; i++{ fmt.Println(i) } 写法三: 初始语句和结束语句都省略,类似于python中的while i := 0 for i < 10 { fmt.Println(i) i++ } 无限循环 i := 0 for { fmt.Println(i) i++ } for range(键值循环) Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律: 数组、切片、字符串返回索引和值。 map返回键和值。 通道(channel)只返回通道内的值。
for练习题 99乘法表
// demo1 func main() { // 遍历, 决定处理第几行 for y := 1; y <= 9; y++ { // 遍历, 决定这一行有多少列 for x := 1; x <= y; x++ { fmt.Printf("%d*%d=%d ", x, y, x*y) } // 手动生成回车 fmt.Println() } }
// demo2 func main () { var x = 1 for x < 10 { x++ for y :=1; y <= x; y++ { fmt.Printf("%v * %v = %v ", x , y, x*y) } fmt.Println() } }
demo1是正确的,demo2由于先定义了变量x,导致进入for循环打印时,x已经经过x++,已经等于2了,所以打印有问题。由于x=9时,满足条件,打印时x=10,所以打印结果会是2开始,10结束。
break
break跳出for循环
func main() { i := 1 for ; i<10 ; i++ { fmt.Println(i) if i >= 5 { break } } }
continue
continue跳过本次for循环,继续下一次, 在 continue语句后添加标签时,表示开始标签对应的循环
func main() { i := 1 for ; i<10 ; i++ { if i == 5 { continue } fmt.Println(i) } } func continueDemo() { forloop1: for i := 0; i < 5; i++ { // forloop2: for j := 0; j < 5; j++ { if i == 2 && j == 2 { continue forloop1 } fmt.Printf("%v-%v\n", i, j) } } }
goto
goto 跳转至指定标签
func main() { var breakFlag bool for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { breakFlag = true break } fmt.Printf("%v - %v \n", i, j) } if breakFlag { break } } } func main() { for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { goto breakTag } fmt.Printf("%v - %v \n", i, j) } } return breakTag: fmt.Println("finish") }
goto,break,continue三个语法都可以配合标签使用,区分大小写,Break与continue配合标签可用于多层循环的跳出,goto是调整执行位置,与其它2个语句配合标签的结果并不相同。
break不使用标签只是跳出上一层循环,使用标签则是跳出于标签同级的循环。
continue不加标签是跳过本次for循环,继续下一次,加标签是跳到与标签平级的for循环的下一次循环。
switch
#default每个switch只能有一个 func main() { i := 1 switch i { case 1: fmt.Println("a") case 2: fmt.Println("b") default: fmt.Println("nonono") } } #多个值判断 func main() { switch n := 7; n { case 1, 3, 5, 7, 9: fmt.Println("奇数") case 2, 4, 6, 8: fmt.Println("偶数") default: fmt.Println(n) } } #使用表达式 func main() { age := 30 switch { case age < 25: fmt.Println("好好学习吧") case age > 25 && age < 35: fmt.Println("好好工作吧") case age > 60: fmt.Println("好好享受吧") default: fmt.Println("活着真好") } } #fallthrough 执行满足条件的下一个case func main() { i := 1 switch i { case 1: fmt.Println("a") fallthrough case 2: fmt.Println("b") default: fmt.Println("xxxx") } }
参考 https://www.liwenzhou.com/posts/Go/go_menu/ 整理记录