内置函数
- close:主要用来关闭channel
- len:用来求长度,比如string、array、slice、map、channel
- new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
- make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
- append:用来追加元素到数组、slice中
– 如有切片 - panic和recover:用来做错误处理,捕捉错误
func test() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
err := initConfig()
if err != nil {
panic(err)
}
return
}
闭包
- 闭包:一个函数和与其相关的引用环境组合而成的实体
- 例如: 函数1的返回值是函数2,则这个返回值的函数2,包括函数1里面的一些变量,整体构成一个闭包
package main
import (
"fmt"
"strings"
)
func makeSuffixFunc(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
func main() {
func1 := makeSuffixFunc(".bmp")
func2 := makeSuffixFunc(".jpg")
fmt.Println(func1("test"))
fmt.Println(func2("test"))
}
数组与切片
数组
- 数组定义:var a [len]int,比如:var a[5]int
- 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型
- 数组本身是值类型,赋值给另外一个数组后,改变新数组的值,旧数组是不变的
一维数组
- 初始化
var a [5]int = [5]int{1,2,3,4,5}
var b = [5]int{6,7,8,9,10}
var c = [...]int{11,12,13,14,15}
var d =[5]int{1:5,2:10}
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
- 遍历
var a [10]int
for _,val:=range a{
fmt.Println(val)
}
多维数组
- 初始化
var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
- 遍历
var a [3][3]int=[3][3]int{{1,2,3},{4,5,6},{7,8,9}}
for _,v := range a {
for _,value:=range v{
fmt.Println(value)
}
}
切片
- 用数组初始化
var a [5]int = [...]int{1,2,3,4,5}
// 第一个
var slice =a[0:1]
// 全部
slice = a[:]
// 去掉最后一个
slice = a[:len(a) - 1]
- 用make创建切片
var slice []type = make([]type, len)
slice := make([]type, len)
slice := make([]type, len, cap)
- 用append追加元素
数组
var a = []int{1,2,3}
var b = []int{4,5,6}
a = append(a, b…)
切片
var slice = make([]int, 2)
slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)
会自动往后面增加容量,但是扩容之后,是新开了一段内存空间,和之前的不一样,并且是2倍增加
- 用copy拷贝
s1 := []int{1,2,3,4,5}
s2 := make([]int, 10)
copy(s2, s1)
- string底层就是一个byte的数组,因此,也可以进行切片操作
str := “hello world”
s1 := str[0:5]
- 但是不可用str[0]来直接改变,本身不可变,如果要变,需要转成数组,再改(建议用rune,根据字符可变,便于处理中文)
name :="林秀贤"
tmpName :=[]rune(name)
tmpName[0] = '李'
newName :=string(tmpName)
fmt.Println(newName)
输出:
李秀贤