zoukankan      html  css  js  c++  java
  • Go语言的学习之旅【三】

    一、常量

    	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语言),还是很快上手!

  • 相关阅读:
    BIOS详解:什么是BIOS ?BIOS的作用?CMOS及其与BIOS的关系?
    随机数不随机
    解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
    保护模式特权级别DPL,RPL,CPL 之间的联系和区别
    Linux内核 hlist_head/hlist_node结构解析
    x86中的页表结构和页表项格式
    Linux下/proc目录简介
    bdev文件系统
    X86 IO端口和MMIO
    Mac OS Alfred 2 tips
  • 原文地址:https://www.cnblogs.com/zrl66/p/14064376.html
Copyright © 2011-2022 走看看