Go语言学习笔记一
发布时间:2020-12-16 18:28:22 所属栏目:大数据 来源:网络整理
导读:书籍:《Go语言编程》 Chap 1 初识Go语言 1.Go语言主要特性:自动垃圾回收,更丰富内置类型,函数多返回值,错误处理,匿名函数和闭包,类型和接口(不支持继承和重载,仅支持组合),并发贬称,反射,语言交互性。 2.Go语言的main函数不能带有参数也不能有
书籍:《Go语言编程》 Chap 1 初识Go语言 1.Go语言主要特性:自动垃圾回收,更丰富内置类型,函数多返回值,错误处理,匿名函数和闭包,类型和接口(不支持继承和重载,仅支持组合),并发贬称,反射,语言交互性。2.Go语言的main函数不能带有参数也不能有返回值。Go语言函数定义: func 函数名(参数列表) (返回值列表){//函数体} 3.编译:go build hello.go;编译运行,不产生中间编译文件和执行文件:go run hello.go Chap 2 顺序编程 1.Go语言不需要使用分号。 2.变量声明使用关键字var,格式为:var 变量名 变量类型 3.变量初始化的三种方式: var v1 int = 10 var v2 = 20//自动推导 v3 := 30//自动推导,完成声明和初始化,会产生变量v3,因此v3不能是已经声明的变量 虽然能自动推导,但是Go语言是强类型语言。 4.支持多重赋值,例如:i,j=j,i//交换i、j变量的值 5.函数参数中的变量是匿名变量。 6.定义常量:使用const关键字:const Pi float64 = 3.1415926 7.预定义常量:true、false和iota(可被编译器修改的常量,在每一个const关键字出现时重置为0,在下一个const出现时,没出现一次iota,其值加1)。 8.枚举类型: const( Sunday=iota Monday//会自动推导,Monday等于1 Tuesday numberOfDays//只有大写字母的对外包发布,小写字母开头的不对外发布 ) 9.类型: 1)布尔类型bool:v2 := (1==2) 布尔类型不支持类型转换 2)整形:int32、int64等是固定大小的,int、uint是平台相关的,建议使用平台相关的类型。不同类型如int和int32是不能比较的,会编译错误,但是可以和字面常量(如i==1)进行比较。 3)浮点型:不能直接==进行比较,可以导入math后根据相差的大小设置范围进行相等的比较。 4)复数类型complex:var a complex 5)字符串string:var str string 通过类似数组下标访问,但是不能修改。默认为UTF-8字符,中文包括三个字节。遍历中文是可使用range函数对字符串进行Unicode字符遍历。 6)字符类型:byte代表单个utf-8字节(一个汉字三个字节),rune代表单个unicode字符(一个汉字一个字符)。 7)数组类型:数组名 [number]类型 数组类型是值类型,因此函数参数如果是数组,会发生内部的复制过程。 8)切片slice:理解为可以动态扩充的数组,函数参数传递时不会发生复制过程。 A.基于数组创造切片:mySlice=myArray[n:m] B.使用make函数:mySlice:=make([]int,5) 9)map类型:var myMap map[Key] Value,可以使用make函数创建。 检查是否存在:value,ok := myMap["key"] 判断ok即可 10.流程控制 1)条件语句: A.if:条件无括号,大括号要紧跟if、else行。 func calc(x int,y int) int { if x>y { return x } else { return y } } B.switch:switch后面的变量可以不写,case可以是表达式(i>5 && i<10),不用谢break,fallthrough紧跟执行。 func calc(i int) int { switch i { case 0: fallthrough case 1: fmt.Println("1") case 2: fmt.Println("2") case 3: fmt.Println("3") default: fmt.Println("Default") } return 7 } 2)循环语句:仅支持for语句。for不需要用(),甚至可以不使用i(直接循环,使用break,类似于while) func calc(x int) int { sum := 0 for i:=0;i<x;i++ { sum+=i } return sum } 3)跳转goto: func calc() int { sum := 0 HERE: fmt.Println(sum) sum++ if sum<100 { goto HERE } return 7 } 11.函数: 1)可接受不定参数func myfunc(args ...int)然后使用range遍历(语法糖结构,调用时更方便,不必使用new int[]{1,2,3}样式传入参数) 2)不定参数支持切片操作 3)支持多返回值,使用_跳过不想使用的返回值 package main import ( "errors" "fmt" ) func Add(a,b int) (ret int,err error) { if a<0 || b<0 { err = errors.New("Should be non-negative numbers!") return } return a+b,nil } func main(){ fmt.Println(Add(1,3)) } 12.匿名函数和闭包: 1)匿名函数可以直接赋值给某个变量 f:=func(x,y int) int { return x+y } 2)闭包:理解为匿名函数+系统环境(代码中的变量等内容不再代码中定义) f:=func()(func()){ var i int = 10 return func(){ fmt.Printf("i,j:%d,%dn",i,j) } }() f() j*=2 f() 注意:定义函数func,返回类型为func(),最后需要加(),这样i外部不能访问,之后定义的j在f的多次调用后可以不同。 13.defer(延迟函数)定义后将以先进后出的方法进行调用。panic()函数调用后:正常的函数执行流程将立即终止,但函数中之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致 逐层向上执行panic流程,直至所属的goroutine中所有正在执行的函数被终止。recover()函数用于终止错误处理流程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |