函数的创建
go语言用使用func关键字声明一个函数,调用函数也非常简单,函数名+()即可
注意:如果函数名首字母是小写表示私有函数只有 通过外部import是无法调用的 如果函数需要外部调用需要首字母大写,并且go推荐的也是大驼峰的命名方式
package main
import "fmt"
func hello() {
fmt.Println("hello world")
}
func main() {
hello()
}
函数可传参数
我们可以在()里面传输一个数据参数并且使用它
package main
import "fmt"
func hello(str string) {
fmt.Println(str)
}
func main() {
str:="hello world"
hello(str)
}
函数可以传多个参数
package main
import "fmt"
func hello(str,name string) {
fmt.Println(str,"我的名字是:"+name)
}
func main() {
str:="hello world"
name:="xxm"
hello(str,name)
}
函数具有返回值:
package main
import "fmt"
func hello(str,name string) {
fmt.Println(str,"我的名字是:"+name)
}
func getName() string {
name:="xxm"
return name
}
func main() {
str:="hello world"
name:=getName()
hello(str,name)
}
变参函数:
如果函数的最后一个参数是 ...+数据类型的情况下称之为变参函数
一个数组倒装的例子:
package main
import "fmt"
func main() {
var x =[]int{1,2,3,4}
reverseOrder(x...)
}
func reverseOrder(num ...int) {
x:=make([]int,len(num))
for k,v:=range num{
x[(len(num)-1)-k]=v
fmt.Println(v)
}
fmt.Println(x)
}
执行结果:
defer的使用
defer的作用是函数即将结束前做执行操作
package main
import "fmt"
func hello() {
fmt.Println("执行了defer")
}
func main() {
fmt.Println("开始执行")
defer hello()
fmt.Println("准备结束执行")
}
执行结果:
通常我们用于我们经常会忘记的一些关键性代码,比如我们读取了一个文件,在做了一系列的逻辑操作以后会比较容易忘记关闭文件io流,有了defer以后我们可以在执行打开文件的时候接着就使用defer关闭文件流也不影响整理程序的逻辑。
package main
import (
"fmt"
"os"
)
func main() {
file,_:=os.Open("./text.txt")
defer file.Close()
fmt.Println("执行相关的文件流操作逻辑")
}
内置函数:
go语言拥有一些不需要导入就可以使用的内置函数,比如我们的append
package main
func main() {
var x []int
x=append(x,1)
}
还有很多其他内置函数:
名称 | 说明 |
close | 用于管道通信 |
len、cap | len 用于返回某个类型的长度或数量(字符串、数组、切片、map 和管道);cap 是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map) |
new、make | new 和 make 均是用于分配内存:new 用于值类型和用户定义的类型,如自定义结构,make 用于内置引用类型(切片、map 和管道)。它们的用法就像是函数,但是将类型作为参数:new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址,也就是指向类型 T 的指针(详见第 10.1 节)。它也可以被用于基本类型:v := new(int)。make(T) 返回类型 T 的初始化之后的值,因此它比 new 进行更多的工作new() 是一个函数,不要忘记它的括号 |
copy、append | 用于复制和连接切片 |
panic、recover | 两者均用于错误处理机制 |
print、println | 底层打印函数 |
complex、real imag | 用于创建和操作复数 |
递归函数:
实际上就是一个函数自调用的过程
package main
import "fmt"
func hello(x int) {
x+=1
fmt.Println(x)
if x==10{
return
}else {
hello(x)
}
}
func main() {
hello(1)
}
把函数作为一个参数进行传参:
package main
import "fmt"
func add(f func()int) {
x:=f()
fmt.Println(x+1)
}
func getNum() int {
return 1
}
func main() {
add(getNum)
}
闭包:
当我们不想写函数名的时候可以使用匿名函数:
package main
import "fmt"
func main() {
x:=1
func (i int){
fmt.Println(x+10)
}(x)
}
也可以将闭包的函数作为一个返回值
package main
import "fmt"
func add() func(i int) int {
return func(i int) int {
return i+10
}
}
func main() {
a:=add()
x:=a(3)
fmt.Println(x)
}