细节汇总
&
type myInt inttype mySum func(int, int) intmySumfunc(int, int) int
_
值传递和指针传递
func test(n1 int) { n1 = n1 + 10 fmt.Println("test n1=", n1) } // 指针类型接收处理 func test02(n2 *int) { *n2 = *n2 + 10 fmt.Println("test02 n2=", *n2) } func main() { n1 := 20 n2 := 2 test(n1) // 值类型 test02(&n2) // 指针类型 fmt.Println("main n1=", n1) fmt.Println("main n2=", n2) }
什么是重载
重载: 函数名相同,但是形参不同或者数据类型不同的情况。
fn redeclared in this block
Golang语言是支持可变参数的,空接口的形式
函数类型的变量
类型: func(int, int) int
func getSum(n1 int, n2 int) int { return n1 + n2 } func getSums(n1 int, n2 int, n3 int) int { return n1 + n2 + n3 } // main 函数 sumFn := getSum res := sumFn(10, 20) fmt.Printf("%T %v\n", res, res) // int 30 fmt.Printf("%T \n", sumFn) // func(int, int) int sumsFn := getSums result := sumsFn(10, 20, 30) fmt.Printf("result : %T %v\n", result, result) // result : int 60 fmt.Printf("sumsFn类型:%T \n", sumFn) // sumsFn类型:func(int, int) int
函数作为形参传入
func getSum(n1 int, n2 int) int { return n1 + n2 } func testFn(fnVar func(int, int) int, num1 int, num2 int) int { return fnVar(num1, num2) // 调用传入的函数,并返回值 } // 函数类型形参 sumFn := getSum total := testFn(sumFn, 1, 2) fmt.Println("total=", total) // 3
自定义数据类型
- 自定义函数数据类型, 相当于起了一个别名
type mySum func(int, int) int func testFn(fnVar mySum, num1 int, num2 int) int { return fnVar(num1, num2) } // func testFn(fnVar func(int, int) int, num1 int, num2 int) int { // return fnVar(num1, num2) // }
- 自定义数据类型
// main函数下 type myInt int var num1 myInt = 2 // var num2 int = num1 // 这样是报错的, myInt和int并不等价 var num2 int = int(num1) // 显式类型转换 fmt.Printf("num1的类型:%T 值:%v \n", num1, num1) // num1的类型:main.myInt 值:2 fmt.Printf("num2的类型:%T 值:%v \n", num2, num2) // num2的类型:int 值:2
utils.myInt
// 以下是utils包 package utils import "fmt" func TestFn() string { fmt.Println("TestFn 函数被调用") type myInt int var n myInt = 10 fmt.Printf("n的类型:%T 值:%v", n, n) // n的类型:utils.myInt 值:10 return "hahaha" }
返回值命名
func sumSub(n1 int, n2 int) (sum int, sub int) { // 这里不需要声明sum, sub变量了,也不用在return时写 sum = n1 + n2 sub = n1 - n2 return } // main函数 sum, sub := sumSub(9, 8) fmt.Println("sum=", sum, "sub=", sub) // sum= 17 sub= 1
可变参数
基本语法
- 支持零到多个参数
func sum(args... int) {}
- 支持1到多个参数
func sum(n1 int, args... int) {}
func sum(n1 int, **vars**... int) {}
说明:
args[index]
参数个数可变
func sumV2(n1 int, args ...int) int { sum := n1 fmt.Printf("args类型是:%T\n", args) // args类型是:[]int // 遍历args切片 for i := 0; i < len(args); i++ { sum += args[i] } return sum } // main函数 // 参数可变 total02 := sumV2(1, 2, 3, 4) fmt.Println("total02=", total02) // total02= 10
总结练习
交换变量a, b的值
package main import "fmt" func swap(n1 *int, n2 *int) { *n1 = *n1 + *n2 *n2 = *n1 - *n2 // *n1 *n1 = *n1 - *n2 // *n2 } func main() { a := 12 b := 20 swap(&a, &b) fmt.Println("a = ", a, "b = ", b) }