1.自定义函数
package main
import "fmt"
func main() {
TestFun(1, 2, 3, 4, 5, 6)
}
func TestFun() {
fmt.Println("TestFun null")
}
func TestFun(a int, b int) {
fmt.Println("TestFun a:", a, ",b:", b)
}
func TestFun(args ...int) {
fmt.Println(len(args))
for i := 0; i < len(args); i++ {
fmt.Println(args[i])
}
for i, data := range args {
fmt.Println("i:", i, ":data:", data)
}
}
func TestFun(args ...int) {
test(args...)
test(args[2:]...)
}
func test(tmp ...int) {
}
func TestFun() (result string) {
result = "Hello World!"
return result
}
func TestFun() (int, int, int) {
return 1, 2, 3
}
func TestFun(a, b, int) (max, min, int) {
if a > b {
max = a
min = b
} else {
max = b
min = a
}
return max, min
}
2.递归函数
3.函数类型
package main
import "fmt"
func main() {
var fTest FuncType
fTest = Add
c := fTest(1, 2)
fmt.Println(c)
}
type FuncType func(int, int) int
func Add(a, b int) int {
return a + b
}
package main
import "fmt"
func main() {
c := Calu(10, 1, Jdd)
fmt.Println(c)
}
type FuncType func(int, int) int
func Calu(a, b int, mTest FuncType) (result int) {
result = mTest(a, b)
return result
}
func Add(a, b int) int {
return a + b
}
func Jdd(a, b int) int {
return a - b
}
4.匿名函数与闭包
package main
import "fmt"
func main() {
a := 10
str := "Hello"
f1 := func() {
fmt.Println("a:", a)
fmt.Println("str:", str)
}
f1()
type FuncType func()
var f2 FuncType
f2 = f1
f2()
func() {
fmt.Println("a:", a)
fmt.Println("str:", str)
}()
f3 := func(i, j int) {
fmt.Println("i:", i)
fmt.Println("j:", j)
}
f3(1, 2)
func(i, j int) {
fmt.Println("i:", i)
fmt.Println("j:", j)
}(10, 20)
f4, f5 := func(i, j int) (max, min int) {
if i > j {
max = i
min = j
} else {
max = j
min = i
}
return max, min
}(10, 20)
fmt.Println("f4:", f4)
fmt.Println("f5:", f5)
}
- 所谓闭包就是一个函数捕获了和它同一作用域的常量和变量,这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能使用这些常量或者变量,他不关心这些捕获了的常量和变量是否超出了作用域,所以只要闭包还在使用它,这些变量就会存在
package main
import "fmt"
func main() {
a := 10
str := "Hello"
f1 := func() {
fmt.Println("a:", a)
fmt.Println("str:", str)
}
f1()
type FuncType func()
var f2 FuncType
f2 = f1
f2()
func() {
fmt.Println("a:", a)
fmt.Println("str:", str)
}()
f3 := func(i, j int) {
fmt.Println("i:", i)
fmt.Println("j:", j)
}
f3(1, 2)
func(i, j int) {
fmt.Println("i:", i)
fmt.Println("j:", j)
}(10, 20)
f4, f5 := func(i, j int) (max, min int) {
if i > j {
max = i
min = j
} else {
max = j
min = i
}
return max, min
}(10, 20)
fmt.Println("f4:", f4)
fmt.Println("f5:", f5)
fmt.Println("--------------")
fmt.Println(Test())
fmt.Println(Test())
fmt.Println(Test())
fmt.Println(Test())
fmt.Println(Test())
fmt.Println("--------------")
f := Test01()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
func Test() int {
var x int
x++
return x * x
}
func Test01() func() int {
var x int
return func() int {
x++
return x * x
}
}
5.延迟调用defer
package main
import "fmt"
func main() {
fmt.Println("1")
defer fmt.Println("2")
fmt.Println("3")
}
- 如果一个函数中有多个defer,他会以后进先出的顺序执行,并且不管函数发生什么错误,都不会影响defer的执行
package main
import "fmt"
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
}
package main
import "fmt"
func main() {
a := 10
b := 20
defer func() {
fmt.Println("a:", a, "b:", b)
}()
a = 11
b = 21
}
6.获取命令行参数
package main
import "fmt"
import "os"
func main() {
list := os.Args
n := len(list)
fmt.Println("n:", n)
for i := 0; i < n; i++ {
fmt.Println("list:", list[i])
}
}
7.作用域
- 定义在大括号里为局部变量,他的作用域就在括号内
- 定义在大括号外的为全局变量,他的作用域是全局
- 局部变量和全局变量同名的情况下优先局部变量
8.工程管理
package main
import "fmt"
import (
"fmt"
)
import . "fmt"
import put "fmt"
import _ "fmt"
func main() {
put.Println("Hello ")
}
- go env 查看GOPATH
- 多文件必须放在src
- 设置GOPATH环境变量
- 同一个目录的包名必须一致
- 同一个目录调用别的文件的函数直接调用即可
- 不用目录,包名不一样
- 调用不同包里的函数,格式:包名.函数名
- 首字母大写才能供别人调用
package main
import (
"calu"
"fmt"
)
func main() {
a := calu.Add(1, 1)
fmt.Println("a:", a)
}