第二章 GO语言顺序编程
一:变量,对于声名变量Go引入了 var
如:var str string
声名一批变量:
var (v1 intv2 string)
变量初始化: var v1 int =10
var v2 =10
v3 :=10
二: := 但含义是明确表达,同时进行变量声名和初始化,所以 := 左边的变量不能是初始化过的不然会报错
如: var i int
i :=2 这样就会报错,因为i已经初始化过了
三:变量赋值,在Go中提供了多重赋值的方式 如:i,j=j,i 这样的代码就是把右边j的值赋值给i,吧i的值赋值给j,相当于 c#里面的 t=i;i=j;j=t;
四:匿名变量,在C#中如果一个函数要返回多个值,是一个痛苦的事情,需要很多的变量 out关键字,但是在GO中就可以比较的轻松了,如下:
func GetName()(ret1,ret2,ret3 string) {return "赵占龙","瀚海","数据"}func tty() {_,nicName,_ :=GetName()fmt.Println("数据:",nicName)}这样接收返回值的话只会接收nicname其他两个是匿名的
五:常量 1:字面常量,就是变成的时候硬编码的常量 如: -12 3.1345,3.2+4.5,在GO中字面常量是没有类型的,只要这个常量在相应的值域范围内就可以为该类型的常量,如-12 可以是int uint int32 floa32 。。。。
2:定义常量,可以给字面常量指定一个友好的名字 ,使用const关键字这个和其他语言一样 如: const p1 int =22 const(p2 int =2)
Go语言工给常量指定类型,但是类型不是必须的,如果不指定那就和字面常量一样,是无类型的如:
const a,b,c =2,3,"oop",定义常量可以是一个编译期的常量表达式 const mm=1<<3,但是不能是运算期表达式不然会报错
六:预定义常量,在Go中预定义了这些常量 true false iota,其中iota是在每个const出现的时候iota呗重置为0,然后在下一次const出现前,没出现一次iota,iota都会增加1,如下:
func testconst() {const (c0=iotac1=iotac2=iota)const (a1=iotaa2=iotaa3=iota)fmt.Println("数据iota:",a3,c1)}
数据iota: 2 1
七枚举:枚举就是一系列相关的常量,在Go语言不支持其他语言明确支持的enum,如下:
const (Sunday=iotaMondayTuesdaynumberday)首字母大写是在包外可见的(相当于public ),首字母小写是为包私有(相当于private)
八:比较 不同类型的书不能直接比较,但是各种类型变量可以直接与字面变量比较
var i int32var j int64i,j=1,2//这个是会报错的if i==j{}//这个可以通过(因为字面变量是无类型的)if i==1 || j==2{}
九:浮点型比较 浮点类型不是一种准确的表达式所以不能像整数类型那样使用 ==来判断是否相等,但是可以使用下面这样的方式 如:
func IsEqual(f1,f2,p float64) bool {return math.Fdim(f1,f2)<p}
十:复数类型 复数类型实际就是两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag) 如下:
var val1 complex64val1=3.2+12ival2 :=3.2+12ival3 :=complex(val1,val2)对于一个复数,z=complex(x,y) 然后通过 real(z)取的复数的实数部分,也就是x,通过imag(z)来取得复数的虚部 ,也就是y
十一:字符串遍历 如:
func sestr() {str :="hello,赵占龙"n :=len(str)for i :=0;i<n;i++{ch :=str[i]fmt.Println("字节组遍历:",i,ch)}for i,ch :=range str{fmt.Println("unicode类型遍历:",i,ch)}}字节组遍历: 0 104字节组遍历: 1 101字节组遍历: 2 108字节组遍历: 3 108字节组遍历: 4 111字节组遍历: 5 44字节组遍历: 6 232字节组遍历: 7 181字节组遍历: 8 181字节组遍历: 9 229字节组遍历: 10 141字节组遍历: 11 160字节组遍历: 12 233字节组遍历: 13 190字节组遍历: 14 153unicode类型遍历: 0 104unicode类型遍历: 1 101unicode类型遍历: 2 108unicode类型遍历: 3 108unicode类型遍历: 4 111unicode类型遍历: 5 44unicode类型遍历: 6 36213unicode类型遍历: 9 21344unicode类型遍历: 12 40857在支付类型中支持两个字符类型 一个是 byte代表utf-8的单位字符串,另一个是rune是代表是unicode字符串
十二:数组 数组声明的方法是如下:
var arry [10]int=[10]int{1,2,3,4,56,7,8,9,0,1}var myarry []int=arry[:5]for _,v :=range myarry{fmt.Println("切片数据:",v)}切片数据: 1切片数据: 2切片数据: 3切片数据: 4切片数据: 56//直接创建切片并初始化为0myslic :=make([]int,5)for _,v :=range myslic{fmt.Println("直接创建切片:",v)}
十三:动态增减元素
//数组切片动态增减元素myslell :=make([]int,5,10)fmt.Println("数组分片分配的空间大小cap:",cap(myslell))fmt.Println("数组分片的元素个数len:",len(myslell))//动态的添加元素到分片myslell =append(myslell,1,2,43)fmt.Println("数组分片分配的空间大小cap:",cap(myslell))fmt.Println("数组分片的元素个数len:",len(myslell))//直接添加数组,注释myap后面的三个点,不然会报错,,因为append方法的第二个参数都是待插入的参数,myslell是int类型,而myap是数组,所以要添加...吧myap数据打散插入myap :=[]int{1,2}myslell=append(myslell,myap...)fmt.Println("数组分片分配的空间大小cap:",cap(myslell))fmt.Println("数组分片的元素个数len:",len(myslell))数组切片的元素范围可以超过被切片的数组元素个数,只要不超过被切片数组的cap就可以 (cap:数组占用空间大小)数组复制:copy(数组1,数组2) 吧数组二的内容复制到数组1,数组长度按做小数组算
十四:map map是一堆未排序的键值对集合,具体操作如下:
func maptest() {var personDb map[string] personpersonDb=make(map[string] person)//往map插入元素personDb["zzl"]=person{"123456","赵占龙","汽车之家"}personDb["tty"]=person{"3","瀚海","中国电子大厦"}//map取值,也可用于查账元素,只有找到了ok才是truepson,ok:=personDb["zzl"]if (ok){fmt.Println("数据:",pson.ID,pson.Name,pson.Address)}else {fmt.Println("读取失败")}map声明变量:var personDb map[string] person 其中personDb是map的变量名称,string是map的键的类型,person 是map值的类型map创建: personDb=make(map[string] person)personDb=make(map[string] person,100)创建并指定map的大小
personDb=make(map[string] person{"123456","赵占龙","汽车之家"})创 建并初始化
delete(personDb,"zzl"):删除map中键是zzl的元素

浙公网安备 33010602011771号