var n int = 10
return func(x int) int{
n = n + x
return n
}
如上代码块,返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包说明:当我们反复的调用f函数时,因为n是初始化一次,因此每调用一次就进行累计,体现出闭包的优越性
11.defer
当执行到defer时,会将defer后面的语句压入到独立的栈(defer栈),当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行
12.字符串中常用的系统函数
字符串转整数
n, err := strconv.Atoi("12")
整数转字符串
str := strconv.Itoa("12")
字符串转 []byte
var bytes = []byte("hello go")
[]byte转字符串
str = string([]byte{97,98,99})
10进制转2,8,16进制
str = strconv.FormatInt(123, 2) //2->8,16
*查找子串是否在指定的字符串中
strings.Contains ("seafood", "food") //true
*统计一个字符串有几个指定的子串
strings.Count ("ceheese", "e") //4
*不区分大小写的字符串比较(==是区分大小写的)
strings.EqualFold ("abc", "ABC") //true
*返回子串在字符串第一次出现的index值,如果没有返回-1
strings.Index("NLT_abc", "abc") //4
*返回子串在字符串最后一次出现的index值,如果没有返回-1
strings.LastIndex("go golang", "go") //3
*将指定的子串替换成另一个子串,n可以指定你希望替换几个,n=-1表示全部替换
strings.Replace("go golang", "go","go语言",n) //3
*按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组
strings.Split("NLT_abc,123,ok", ",")
*将字符串的字母进行大小写的转换
```go
strings.ToLower("GO") //go
strings.ToUpper("gO") //GO
13.内置函数new和make的区别
new: 用来分配内存,主要是用来分配值类型,比如int,float, struct返回的是指针make: 用来分配内存,主要用来分配引用类型,比如channel, map, slice
14. 错误处理机制
使用defer+recover处理错误,好处:进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮自定义错误,使用errors.New和panic内置函数(输出错误信息,并退出程序)
15.map
map的key必须是可比较的类型,因此key不能是slice、map、function类型删除使用delete(map, “key”),如果我们要删除map的所有key,没有一个专门的方法一次删除,可以遍历key,逐个删除;或者map= make(…), make一个新的,让原来的称为垃圾,被gc回收查找, 若ok为true,则cities存在”no1"这个key,值为val; ok为false表示没有
val, ok := cities["no1"]
map的容量达到后,再向map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对
16.JSON
json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写。同时也易于机器解析和生成在编程语言中,一切都是对象。因此,任何的数据类型都可以通过Json来表示,例如字符串、数字、对象、数组、map、结构体等
17. 单元测试
测试用例文件名必须以_test.go结尾。比如cal_test.go,cal不是固定的测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名,比如TestAddUpperTestAddUpper (t testing.T)的形参类型必须是testing.T一个测试用例文件中,可以有多个测试函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)