一、常量
const a int = 123 //常量定义const,显式 //a = 456 //修改常量值,会报错 Cannot assign to a,无法赋值 const b = 23 //隐式 const c,d = 1,"s" //多重赋值 const e,f int = 6,7 //多重赋值,同类型 const (//常量枚举 g = 1 h = "asb" i = len(h) ) fmt.Println(a,b,c,d,e,f,g,h,i) //iota 特殊常量,在定义是为0,后面每行都会计数+1 const ( j = iota k = iota //同一个const中,iota会计数 l //即使不继续赋值也会计数 m = "abc" //即使定义其他数,iota还是会计数 n //这时候n都值为上一个m都值,不过iota还是计数 o = iota //此时不受m影响,iota继续计数 ) const p = iota //这时候iota会刷新计数 fmt.Println(j,k,l,m,n,o,p) const ( q = 1<<iota //1左移0 r = 3<<iota //3左移1 s //这个时候s都值为,3 << 2 t //t为 3 << 3 )//可以认为s不仅仅只是取上一个r的结果,而是r的内容,t同理 fmt.Println(q,r,s,t)
二、运算符
//算术运算符 var a = 1+1 b := 2-1 c := 10*9 d := 10/3 //默认int整型类型,答案是3 e := 8%2 //取模(求余) a++ //自增 b-- //自减 //++a,--a这样的写法不允许 //f := a++ 这样的组合也不被允许 fmt.Println(a,b,c,d,e) //关系运算符 var g int = 1 var h int = 2 if g == h{ //if(g==h)带括号也是可以的 fmt.Println("相等") }else { fmt.Println("不相等") } if(g < h){ fmt.Println("g小于h") }else{ fmt.Println("g大于h") } if(g <= h){ fmt.Println("g小于等于h") }else{ fmt.Println("g不小于等于h(g大于h)") } //逻辑运算符 var i bool = true var j bool = false if(i && j){//i且j都为真 fmt.Println("i,j都为true") }else{ fmt.Println("i,j存在一个为false,或者都为false") } if(i || j){//i或j为真 fmt.Println("i为true,或者j为true") }else{ fmt.Println("i跟j都为false") } if(!(i && j)){ fmt.Println("(i && j)为false,在取反为true") }else{ fmt.Println("(i && j)为true,在取反为false") } //位运算符 /* k=60, 二进制 0011 1100 l=13 0000 1101 */ var k,l = 60, 13 m := k & l //且 1=1&1,m二进制 0000 1100 n := k | l //或 1=1|0, n二进制 0011 1101 o := k ^ l //异或 1 = 1^0, o二进制 0011 0001 p := k << 1 //左移 0011 1100 向左移动1位,p二进制0111 1000 q := k >> 1 //右移 0011 1100 向左移动1位,p二进制0001 1110 fmt.Println(m,n,o,p,q) //赋值运算符 var r int r = k //简单都赋值 fmt.Println(r,k,r) r += k //等于r = r + k fmt.Println(r,k,r) r -= k //同上 fmt.Println(r,k,r) r *= k //同上 fmt.Println(r,k,r) r /= k //同上 fmt.Println(r,k,r) r %= k //同上 fmt.Println(r,k,r) r <<=k //同上 fmt.Println(r,k,r) r >>=k //同上 fmt.Println(r,k,r) r &= k //同上 fmt.Println(r,k,r) r |= k //同上 fmt.Println(r,k,r) r ^=k //同上 fmt.Println(r,k,r) //其他运算符 var s *int fmt.Println(&r) //表示取到r的内存地址 r = 10 s = &r fmt.Println(*s) //这个是一个指针 fmt.Println(s)//指针地址 //运算符优先级 /*由上至下 (优先级递减),同级由左到右(优先级递减), 符号 * / % << >> & &^ 符号 + - | ^ 符号 == != < <= > >= 符号 && 符号 || */
三、条件与循环
func main() { //if...else...语句 var a int = 1 if a == 1 { fmt.Println("a等于1") if a > 0 { //嵌套if语句 fmt.Println("a大于0") } } else { fmt.Println("a不等于1") } //switch语句 switch a { case 1: fmt.Println("a等于1") case 2: fmt.Println("a等于2") default: fmt.Println("上面条件都不符合") } //select语句 //select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。 //select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。 var i, j, k, ch, stopCh chan int //定义通信int类型 var o, p int select { case o = <-i: fmt.Println("received", o, "from i") case j <- p://阻塞 fmt.Println("sent ", p, " to j") case q, ok := (<-k)://这里是q := <-k, ok是接收状态(非阻塞)会造成cpu使用高 if ok { fmt.Println("received", q, " from k") } else { fmt.Println("k is closed") } default: fmt.Println(" no communication") } //构建通道 ch = make(chan int) stopCh = make(chan int) //并发匿名函数 go func() { // 从3循环到0 for v := 3; v >= 0; v-- { // 发送3到0之间的数值 ch <- v // 每次发送完时等待 time.Sleep(time.Second) } stopCh <- 1 }() fmt.Println("-------------") // 遍历接收通道数据 for { select { case x := <- ch: fmt.Println("received x ", x) case y := <- ch: fmt.Println("received y ", y) case _ = <- stopCh: goto end //跳转操作 } } end: }
//循环体 for i := 0; i < 100; i++{ if(i == 0){ continue //跳过此次循环 } if(i == 66){ break //跳出循环 } fmt.Println("i:",i) } for i := 0; i < 100; i++{ if(i == 55){ goto end //跳到end处 } fmt.Println("ii:",i) } end: fmt.Println("结尾end") var j int = 100 for {//死循环,也可以 for true{} j-- if(j == 0){ break } fmt.Println("j:",j) } fmt.Println("退出")
四、函数
package main import "fmt" //全局变量 var g int = 10 //声明一个函数类型 type cb func(int) int func main() { fmt.Println("Hello, World!") var x,y int = 1,2 g = x + y fmt.Println("g:",g)
//重新定义g
var g int = 20
//这里会优先使用局部参数g
fmt.Println("局部g:",g);
a, b := swap(1, 2) fmt.Println(a, b) var c, d = 4, 5 swap2(&c, &d) fmt.Println(c, d) r := test(10, func(i int) int { //直接传入匿名函数 return i }) fmt.Println(r) t := test(100, callback) fmt.Println(t) } //函数作为参数传递 func test(x int, f cb) int { return f(x) } func callback(x int) int { fmt.Println("自定义回调函数",g) return x } //交换值,引用传递 func swap2(x *int, y *int) { var temp int temp = *x *x = *y *y = temp } //交换值 func swap(x int, y int) (int, int) { var temp int temp = x x = y y = temp return x, y }
五、总结
go语言中常量设定是不可修改,运算符类型跟其他语言相差无几,主要自增、自减没有++i,--i,a=i++这样的操作。条件跟循环大部分语言一致,条件语句还新增select语句(咋一看还以为是sql语法),其实是专门给信号判断的一个语句。还保留了goto end跳转语法。函数方法很喜欢,虽然跟c挺像的。整体还是很好接受,有一点其他语言基础的(特别是c语言),还是很快上手!