函数的基本概率
为完成某一功能的程序指令(语句)的集合,称为函数。
在Go中,函数分为:自定义函数,系统函数(Go编程手册中的package builtin包中,可以直接使用,不需要引包)
函数的基本语法
func 函数名 (形参列表)(返回值列表){
执行语句…
return 返回值列表
}
1)形参列表:表示函数的输入
2)函数中的语句:表示为了实现某一功能代码块
3)函数可以有返回值,也可以没有
包的三大作用
- 区分相同名字的函数,变量等标识符
- 当程序文件很多时,可以很好的管理项目
- 控制函数,变量等访问范围,即作用域
包使用的注意事项和细节讨论
1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是utils文件的包名通常和文件所在的文件夹名一致,一般为小写字母。
2)当一个文件要使用其它包函数或变量时,需要引入对应的包
引入方式1: import “包名”
引入方式2:import(
“包名”
“包名”
)
package 指令在文件第一行,然后是import指令。
在import包,路径从$GOPATH的src下开始,不用带src,编译器会自动从src下开始引入。
3)为了让其它包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的public修饰符,这样才能跨包访问。
4)在访问其它包函数,变量时,其语法是 包名.函数名
5)如果包名较长,Go支持给包取别名,注意细节:取别名后,原来的包名就不能使用 了。
6)在同一包下,不能有相同的函数名(也不能有相同的全局变量名)否则报重复定义。
7)如果你要编译一个可执行程序文件,就需要将这个包声明为main,即package main这个就是一个语法规范,如果你是写一个库,包名可以自定义。
函数使用的注意事项和细节讨论
1)函数的形参列表可以是多个,返回值列表也可以是多个。
2)形参列表和返回值列表的数据类型可以是值类型和引用类型。
3)函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其它包文件使用,类似public,首字母小写,只能被本包文件使用,其它包文件不能使用,类似privat.
4)函数中的变量是局部的,函数外不生效。
5)基本数据类型和数组默认都是值传递,即进行值拷贝,在函数内修改,不会影响到原来的值。
6)如果希望函数内的变量能修改函数外的变量(指的是默认以值传递的数据类型)可以传入变量的地址&,函数内以指针的方式操作变量。
7)Go函数不支持函数重载。
8)在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用。
9)函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
10)为了简化数据类型定义,Go支持自定义数据类型
基本语法: type 自定义数据类型名 数据类型 //相等于一个别名
案例 : type myInt int //这时myInt 就等价int 来使用了
11)支持对函数返回值命名
12)使用 _ 标识符,忽略返回值
13)Go支持可变参数
//支持0到多个参数
func sum(args… int)sum int {
}
//支持1到多个参数
func sum(n1 int,args… int)sum int{
}
(1)args是slice切片,通过args[index]可以访问到各个值
(2)如果一个函数的形参列表中有可变参数,则可变参数需要放到形参列表最后。
init函数
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用。
闭包
基本介绍:闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)
1)AddUpper是一个函数,返回的数据类型是fun(int) int
2)闭包的说明:返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
3)闭包是类,函数是操作,n是字段。函数和它使用到n构成闭包。
4)当我们反复的调用f函数时,因为n是初始化一次,因此每调用一次就累加。
5)闭包的关键就是,分析出返回的函数它使用(引用)到那些变量,因为函数和它引用到的变量共同构成闭包。
体会闭包的好处,如果使用传统的方法,需要每次都传入后缀名。
函数的defer
为什么需要defer
在函数中,程序员经常需要创建资源,(比如:数据连接,文件句柄,锁等),为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer(延时机制)
函数参数传递方式
1)值传递
2)引用传递
不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是传递地址的是拷贝,一般类来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。
(1)值类型:基本数据类型 int 系列,float系列,bool,string,数组和结构体struct
(2)引用类型: 指针,slice切片,map,管道chan,interface等都是引用类型
字符串常用的系统函数
1)统计字符串的长度,按字节 len(str)
2)字符串遍历,同时处理有中文的问题 r := []rune(str)
3)字符串转整数 n,err := strconv.Atoi(“12”)
4)整数转字符串 str = strconv.Itoa(12345)
5)字符串转 []byte var bytes = []byte(“hello go”)
6) []byte 转 字符串 str = string([]byte{97,98,99})
7)10进制 转 2 , 8 , 16进制 str = strconv.FormatInt(123,2) //2代表二进制
8)查找子串是否在指定的字符串中 strings.Contains(“seafood”,“foo”) //true
9)统计一个字符串有几个指定的子串 strings.Count(“ceheese”,“e”)
10)不区分大小写的字符串比较 (==是区分字母大小写的)strings.EqualFold(“abc”,“Abc”) //true
11)返回子串在字符串第一次出现的index值,如果没有返回-1 ,strings.Index(“NLT_abc”,“abc”) //4
12)返回子串在字符串最后一次出现的index,如没有返回-1 strings.LastIndex(“go golang”,“go”) //3
13)将指定的子串替换成 另外一个子串 strings.Replace(“go go hello”,“go”,“go语言”,n) n可以指定你希望替换几个,n= -1 全部替换
14)按照指定的某个字符,为分割标识,将一个字符串分成字符串数组: strings.Split(“hello,wrold,ok”,“,”)
15)将字符串的字母进行大小写的转换 strings.ToLower(“Go”) strings.ToUpper(“Go”)
16)将字符串左右两边的空格去掉 strings.TrimSpace(“tn a lone go peh nte “)
17)将字符串左右两边指定的字符串去掉 strings.Trim(”!hello!”,“!”)
18)将字符串左边的指定的字符去掉 strings.TrimLeft(“!hello!”,“!”)
19)将字符串右边的指定的字符去掉 strings.TrimRight(“!hello!”,“!”)
20)判断字符串是否以指定的字符串开头 strings.HasPrefix(“ftp://192.168”,“ftp”)
21)判断字符串是否以指定的字符串结束 strings.HasSuffix(“NLT_abc.jpg”,“jpg”)
时间和日期相关的函数
1)time.Time 类型 ,用于表示时间
2)获取当前时间 time.Now()
3)格式化日期时间
“2006/01/02 15:04:05” 这个字符串的各个数字是固定的,必须是这样写
常用的作用:在程序中可用于获取指定时间单位的时间,比如想得到100毫秒100*time.Millisecond
time的Unix和UnixNano的方法
错误处理