一、函数的基本定义
package main
import "fmt"
// 函数
// 定义一个不需要参数也没返回值的函数: sayHello
func sayHello(){
fmt.Println("Hello jiayuan!")
}
// 定义一个接收string类型的name参数
func sayHello2(name string){
fmt.Println("Hello", name)
}
// 定义接收多个参数的函数并且有一个返回值
func intSum(a int, b int)int{
ret := a + b
return ret
}
func intSum2(a int, b int)(ret int){
ret = a + b
return
}
// 函数接收可变参数
func intSum3(a ...int)int{
ret := 0
for _, v := range a {
ret = ret + v
}
return ret
}
// 固定参数和可变参数同时出现时 可变参数放在最后
// go语言的函数中没有固定参数
func intSum4(a int, b ...int)int{
ret := a
for _, v := range b {
ret = ret + v
}
return ret
}
// Go语言中函数参数类型简写
func intSum5(a, b int)(ret int){
ret = a + b
return
}
// 定义具有多个返回值的函数
func calc(a, b int)(sum, sub int){
sum = a + b
sub = a - b
return
}
func main(){
//函数调用
sayHello()
sayHello2("jushi")
fmt.Println(intSum3())
fmt.Println(intSum3(1))
fmt.Println(intSum3(1, 2))
fmt.Println(intSum3(1, 2, 3))
fmt.Println(intSum4(10)) // a = 10, b = []
fmt.Println(intSum4(10, 20)) // a = 10, b = [20]
fmt.Println(intSum4(10, 20, 30)) // a = 10, b = [20, 30]
x, y := calc(100, 200)
fmt.Println(x, y)
}
二、变量作用域
package main
import "fmt"
// 函数进阶之变量作用域
// 定义全局变量num
var num = 10
// 定义函数
func testGlobal() {
fmt.Println("全局变量", num)
num = 100
// 函数中使用变量
// 1. 先在自己函数中查找 找到了就用
// 2. 函数中找不到变量就往外层找全局变量
// 可以在函数中访问全局变量
fmt.Println("变量", num)
//name := "jiayuan"
}
func main() {
testGlobal()
// 外层不能访问到函数的内部变量 (局部变量)
// fmt.Println(name)
// 变量i此时只在for循环的语句块中生效
for i:=0; i<5; i++{
// fmt.Println(i)
}
// fmt.Println(i) // 外层访问不到内部for语句块中的变量
abc := testGlobal
abc()
}
三、函数作为变量
package main
import "fmt"
func add(x, y int)int{
return x + y
}
func sub(x, y int)int{
return x - y
}
func operator(x, y int, op func(int, int)int) int {
return op(x, y)
}
func main(){
fmt.Println(operator(1, 2, add))
fmt.Println(operator(3, 6, sub))
}
四、延迟执行
package main
import "fmt"
// defer 延迟执行
func main(){
fmt.Println("start...")
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
fmt.Println("end...")
}