Golang知识点-函数和闭包
函数
在调用函数的时候,会给该函数分配一个新的栈区。基本数据类型一般放在栈区,引用类型放在堆区。
Go
语言总支持多个返回值- 希望忽略某个返回值,使用下划线
_
,表示占位符 - 返回值如果只有一个,则可以不写
- 基本数据类型和数组都是值传递,即进行值拷贝,在函数内修改,不会影响原来的值
Go
语言不支持传统的函数重载(函数名相同,变量不同)- 函数也是一种数据类型,可以赋值给一个变量,该变量成为函数类型的变量。
- 函数可以作为形参,进行调用
1 | func 函数名 (参数列表) (返回值列表){ |
1 | package main |
包
go
语言中的每个文件都是一个包- 区分相同名字的函数、变量等标识符
- 控制函数、变量等访问范围,即作用域
- 为了外部访问,将函数名首字母大写
- 文件的包名通常和所在的文件夹名相同
- 引入包的时候,路径是从
GOPATH
开始的,从src
下开始,不用带上src
- 如果给包取了别名,则需要使用别名来进行访问
递归调用
在函数被调用的时候会分配一个新的栈区。栈是先进后出。
1 | package main |
1 | package main |
1 | // 斐波那契数列实现 |
值传递和引用传递
-
值类型:变量直接存储值,内存通常在栈中进行分配。传递效率取决于数据量的大小。
-
int\float
-
bool\string
-
数组
array
-
结构体
struct
-
-
引用类型:变量存储的是地址,地址的空间才是真正存储的数据(值),内存通常在堆上进行分配。如果没有任何变量引用这个地址,由
GC
进行垃圾回收。传递效率高- 指针
pointer
- 切片
slice
- 映射
map
- 管道
channel
- 接口
interface
- 指针
1 | package main |
自定义数据类型
1 | type myInt int // 相当于是别名;myInt和int不是同一个类型 |
Go
语言支持可变参数
- args是切片类型
- 通过args[index]可以进行访问
- 可变参数必须放在最后
1 | func sum(args... int) sum int{ |
1 | package main |
1 | // 两个变量的值交换 |
init函数
每个原文件中都有个init函数;在main函数执行之前,先被调用,完成初始化工作。
- 变量定义----init----main
1 | package main |
- 如果main中引入了另一个文件,执行顺序为:
匿名函数
匿名函数可以多次使用。
- 在定义的时候直接调用,只能调用一次
- 将匿名函数赋值给变量
- 全局匿名函数
1 | package main |
必包
必包=函数+外部引用环境
1 | package main |
defer
延时机制。在函数执行完毕之后及时释放资源。
- 逆序执行,类似栈的结构
- defer将语句压入栈中,同时也会将值拷贝压入栈中
1 | package main |
1 | func test(){ |
变量作用域
- 函数内部声明的变量称为局部变量,作用域仅在函数内部
- 函数外部声明的变量叫全局变量,作用域在整个包内有效;如果首字母大写,则在整个程序内有效
- 如果变量在一个代码块之内入for / if之内,变量的作用域在代码块之内
1 | package main |
1 | package main |
函数练习题
打印金字塔
1 | package main |
字符串中常用的函数
-
len()
-
r := []rune(str),字符遍历,解决中文的问题
-
str = strong.Itoa(1234)
-
var bytes = []byte(“hello go”)
-
str = str([]byte{98,97,99})