【golang笔记】go_函数(6)
Page content
这一篇简单的整理了golang函数的基本内容。
一些基础行的概念就略过了,整理了一些,容易忽略的地方
1.函数中需要注意的地方
1.1 go函数不支持重载
1.2 函数的形参中,值类型和数组默认都是值传递
1.3 函数也是一种数据类型,可以赋给一个变量
给变量赋值
func getSum(n1, n2 int) int {
return n1 + n2
}
func main() {
a := getSum
res := a(1,2)
fmt.Println(res)
}
函数当参数
func myFun(funvar func(int, int) int, n1 int, n2 int) int {
return funvar(n1, n2)
}
func getSum(n1, n2 int) int {
return n1 + n2
}
func main() {
res := myFun(getSum, 1, 2)
fmt.Println(res)
}
声明函数类型
type myFuncType func(int, int) int
func myFun(funvar myFuncType, n1 int, n2 int) int {
return funvar(n1, n2)
}
func getSum(n1, n2 int) int {
return n1 + n2
}
func main() {
res := myFun(getSum, 1, 2)
fmt.Println(res)
}
1.4 支持可变参数
func sum(args... int){
、、args是slice,所以通过args[index]可以访问每个值。
}
2.init函数
下图简单的整理了一下init函数执行的顺序
简单的练习
test1
package test1
import "fmt"
func init() {
fmt.Println("test1.....")
}
func Test1func() {
fmt.Println("test1func")
}
test2
package test2
import "fmt"
func init() {
fmt.Println("test2.....")
}
func Test2func() string {
fmt.Println("test2func")
return "test2func"
}
main
package main
import (
"fmt"
_ "testCode/test/test1"
"testCode/test/test2"
)
var aa = test2.Test2func()
func main() {
fmt.Println("main()... aa = ", aa)
}
func init() {
fmt.Println("main init....")
}
执行结果
$ go run main.go
test1.....
test2.....
test2func
main init....
main()... aa = test2func
3.匿名函数
3.1 在定义匿名函数时直接调用,这种方式只能调用一次
package main
import "fmt"
func main() {
res1 := func(n1 int, n2 int) int {
return n1 + n2
}(10, 20)
fmt.Println(res1)
}
3.2 将匿名函数赋给一个变量,在通过变量调用匿名函数
package main
import "fmt"
func main() {
a:= func(n1 int, n2 int) int {
return n1 + n2
}
res1 := a(10, 20)
fmt.Println(res1)
res2 := a(20, 30)
fmt.Println(res2)
}
4.闭包
闭包是一个函数和与其相关的应用环境组合的一个整体。 下面看两个闭包的例子
package main
import (
"fmt"
)
func AddUpper() func(int) int {
var n int = 0
var str string = "str"
return func(x int) int {
n = n + x
str = str + "a"
fmt.Println("str =", str) // str = stra str = straa str = straaa
return n
}
}
func main() {
f := AddUpper()
fmt.Println(f(1)) // 1
fmt.Println(f(1)) // 2
fmt.Println(f(3)) // 5
}
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
func main() {
f := makeSuffix(".jpg")
fmt.Println("文件名处理 =", f("aa")) //文件名处理 = aa.jpg
fmt.Println("文件名处理 =", f("bb.mp3")) //bb.mp3.jpg
fmt.Println("文件名处理 =", f("bb.jpg")) //bb.jpg
}
5.defer
package main
import (
"fmt"
)
func sum(n1, n2 int) int {
defer fmt.Println("n1 =", n1)
defer fmt.Println("n2 =", n2)
n1++
n2++
result := n1 + n2
fmt.Println("n1 + n2 =", result)
return result
}
func main() {
fmt.Println("sum =", sum(10, 20))
}
执行结果
$ go run main.go
n1 + n2 = 32
n2 = 20
n1 = 10
sum = 32
欢迎大家的意见和交流
email: li_mingxie@163.com