本章进行函数学习
1.函数基本规范
如果返回值列表只有一个,可以省略括号。如果没有返回值,返回值类型可以不写。
(1)格式:
func 函数名(形参列表) (返回值类型列表){
return 返回值列表
}
package main
import "fmt"
/*
如果返回值列表只有一个,可以省略括号
格式
func 函数名(形参列表) (返回值类型列表){
return 返回值列表
}
*/
func cal2(num1 int) int {
return num1
}
//函数
func cal(num1 int, num2 int) int {
return num1 + num2
}
func main() {
fmt.Println(cal(3, 4))
}
tips:访问控制权之前提到过,通过首字母大小来限定,首字母大写,包外可访问,首字母小写,本包package访问
(2)多返回值和接收
(3)内存分区
(4)go不支持重载
重载是指函数名相同但是形参列表不同的多个函数,go不支持
(5)可变参数args...
package main
import "fmt"
/*
可变参数符号...
args...int就是任意多int参数
*/
//函数
func test(args ...int) {
//处理可变参数可以当成切片 args相当于数组
for i := 0; i < len(args); i++ {
fmt.Println(args[i])
}
}
func main() {
test()
fmt.Println("------")
test(3)
fmt.Println("------")
test(1, 2, 3, 4)
}
(6)传参(传值,传指针)
(7)函数类型
package main
import "fmt"
/*
go里变量可以指代一个函数,作为函数类型
也可以作为形参
*/
func test(num int) {
fmt.Println("01")
}
func test2(Func func(int), num int) {
fmt.Println("02")
}
func main() {
a := test ///函数类型,指代该函数
//a的类型:func(int) test函数的类型:func(int)
fmt.Printf("a的类型:%T test函数的类型:%T", a, test)
// a等价于test
a(10) // 相当于test(10)
//作为参数调用
test2(test, 10)
test2(a, 10)
}
(8)类型别名(类似cpp的typedef)
虽然本质是一个类型,但是改名前后类型的两个变量不能直接相互赋值,系统认为是不同类型,除非强制类型转换。
(9)函数返回值列表的补充
/* 普通返回*/
func test3(num1 int,num2 int) (int,int){
sub := num1-num2
sum := num1+num2
return sum,sub
}
/* 在返回值列表里相当于已经定义了两个变量,并且固定其作为返回值 */
func test4(num1 int,num2 int) (sum int,sub int){
sub = num1-num2
sum = num1+num2
return
}
package main
import "fmt"
/*
go里变量可以指代一个函数,作为函数类型
也可以作为形参
*/
func test(num int) {
fmt.Println("01")
}
func test2(Func func(int), num int) {
fmt.Println("02")
}
/* 普通返回*/
func test3(num1 int,num2 int) (int,int){
sub := num1-num2
sum := num1+num2
return sum,sub
}
/* 在返回值列表里相当于已经定义了两个变量,并且固定其作为返回值 */
func test4(num1 int,num2 int) (sum int,sub int){
sub = num1-num2
sum = num1+num2
return
}
func main() {
a := test ///函数类型,指代该函数
//a的类型:func(int) test函数的类型:func(int)
fmt.Printf("a的类型:%T test函数的类型:%T", a, test)
// a等价于test
a(10) // 相当于test(10)
//作为参数调用
test2(test, 10)
test2(a, 10)
//
//var m,b,c,d int
m,b := test3(2,1)
c,d := test4(2,1)
fmt.Println(m,b,c,d)
}