go 类型学习

Nov 27, 2015


###变量 使用关键字var定义变量,自动初始化为零值。若提供变量值,由编译器自动推断

	
		package main 

		import(
			"fmt"
		)
		func test()(int,string){
			return 1,"abc"
			
		}

		func main(){
			//s声明变量并进行初始化
			var m int=10
			fmt.Println("%d\n",m)

			//声明时不指明类型,通过初始化值来推导
			var t=true
			if t==true{
				fmt.Printf("bool值为真.\n")
			}

			//多变量赋值时,先计算所有相关值,然后再从左到右依次赋值
			data,i:=[3]int{0,1,1},0
			i,data[i]=2,100
			fmt.Println(data) 

			//可一次定义多个变量
			var x,y,z int
			var d,n="ab",123

			//注意小括号的使用
			var(
				a int
				b float32
				)
			fmt.Println(x,d,n,y,z,a,b)

			//_ go中的特殊变量,任何赋给它的值将被丢弃
			_,s:=test()
			println(s)
		}
	

编译器会将未使用的局部变量当做错误,使用全局变量就不会报错

注意重新赋值与定义新同名变量的区别

	
		var s string="abc"

		fmt.Println(&s)
		s,y:="hello","uu" //重新赋值:与第一个s 在同一层次的代码块中,且有新的变量呗定义
		fmt.Println(&s,y)
		{
			s,z:=10000,30   //定义新同名变量:不在同一层次代码块
			fmt.Println(&s,z)	
		}


###常量 常量值必须是编译器可确定的数字、字符串、布尔值

	
		func main(){
			const x,y int=1,2 //多常量初始化
			const s="hello world" //类型推断
			const(
				a,b=10,100
				c bool=false   //未使用的局部变量不会报错
				)		
	}

	

在常量组中,如不提供类型和初始化值,那么视作与上一常量相同

	
		const(
			s ="aaa"
			x   //x="aaa"
		)
	

常量值还可以是len cap unsafe sizeof 等编译器可确定的函数返回值

	
		const(
			a= "abc"
			b= len(a)
			c=unsafe.sizeof(b)
		)
	

如果常量类型足以存储初始化值,那么不会引发溢出错误

	
		const(
			a byte=100  //int to byte 
			b int=le20  //float64 to int,overflow
		)
	

###枚举 关键字iota 定义常量组中从0开始换行计数的自增枚举值

	
		const(
			sunday =iota  //0
			monday		  //1
			tuesday		  //2
			wednesday	  //3
		)

		const(
			_  = iota		  //iota=0
			KB = 1<<(10*iota) // iota=1 1<<用法含义和C语言一样
			MB = 1<<(10*iota) // iota=2
 			)

如果iota被打断,需显示恢复

	
		const(
			A = iota //0 
			B 		 //1
			C = 'C'  //C
			D 		 //C
			E =iota  //4
		)
	

可通过自定义类型来实现枚举类型限制

	
    type Color int
    const(
    	Black Color = iota
    	Red
    	Blue
    )
    func test (c Color){
    	fmt.Println(c)
    }
    func main(){
    	c :=Black
    	test(c)

    	x :=1
    	test(x)  //Error:  x declared and not used
	}

本文学习来自https://github.com/qyuhen/book