1、函数的形参列表可以是多个,返回值列表也可以是多个。
2、形参列表和返回值列表的数据类型可以是值类型和引用类型。
3、函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其它包文件使用,类似public , 首字母小写,只能被本包文件使用,其它包文件不能使用,类似private。
4、函数中的变量是局部的,函数外不生效
func test() {
var num1 = 10 // num1作用域则只在test函数
}
5、基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
6、如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用
package main
import (
"fmt"
)
//如果希望函数内的变量能修改函数外的变量,
//可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用
func changeNum2(n *int) {
*n++ // *n 表示取值
fmt.Printf("n的本身的存储空间地址%p n的存储空间值%v n指向的值%v", &n, n, *n)
fmt.Println("changeNum2 n ", *n)
}
func main() {
n1 := 20
fmt.Printf("n1的地址%p\n", &n1)
changeNum2(&n1)
fmt.Println("main n1", n1)
}
7、Go函数不支持函数重载
func changeNum(n int) {
n++
}
//go中不支持函数重载.
// func changeNum(n int, n2 int) {
// n++
// n2++
// }
8、在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用
//在Go中,函数也是一种数据类型,可以赋值给一个变量,
//则该变量就是一个函数类型的变量了。通过该变量可以对函数调用
func getSub(n1 int, n2 int) int {
return n1 - n2
}
func main() {
//在go中函数也是一种数据类型
myFun1 := getSub
//调用一把
fmt.Printf("myFun的类型%T\n", myFun1)
fmt.Println("myfun1结果是", myFun1(10, 8))
}
9、函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
//函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
func testFun(fun func(int, int) int, num1 int, num2 int) int {
return fun(num1, num2)
}
//函数可以作为形参
res1 := testFun(myFun1, 100, 40) //页可以直接传入 getSub
fmt.Println("res1结果=", res1)
10、为了简化数据类型定义,Go支持自定义数据类型
基本语法:type 自定义数据类型名 数据类型 // 理解: 相当于一个别名
案例:type myInt int // myInt 就等价 int 来使用了, 注:作为类型使用时,仍需强转
案例:type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int) int
//为了简化数据类型定义,Go支持自定义数据类型
var num100 int = 888
// type integer int 的含义
// 1. 自定义了一个数据类型 integer
// 2. integer 的类型就是int
// 3. 当进行赋值操作时,编译器仍然认为是不同的数据类型,即需要强转
type integer int
var num200 integer = 999
num200 = integer(num100)
fmt.Printf("num100=%d num200=%d\n", num100, num200)
11、支持对函数返回值命名
//支持对函数返回值命名
func getSumAndSub2(n1 int, n2 int) (sum int, sub int) {
sum = n1 + n2
sub = n1 - n2
return
}
//支持对函数返回值命名
sum2, sub := getSumAndSub2(1, 9)
fmt.Printf("支持对函数返回值命名 sum=%d sub=%d\n", sum2, sub)
fmt.Println()
12、使用 _ 标识符,忽略返回值
func cal(n1 int ,n2 int) (sum int , sub int) {
sum = n1 + n2
sub = n1 - n2
return
}
func main() {
res1, _ := cal(10, 20)
fmt.Printf("res1= %d ", res1)
}
13、Go支持可变参数
//支持0到多个参数
func sum(args... int) sum int {
}
//支持1到多个参数
func sum(n1 int, args... int) sum int {
}
说明:
1)args 是slice 切片, 通过 args[index] 可以访问到各个值。
案例演示: 编写一个函数sum ,可以求出 1到多个int的和
//Go支持可变参数
//编写一个函数sum ,可以求出 1到多个int的和
//args... 表示这是一个可变参数 args程序员写,可以自行决定
//... 是固定写法
func sum(n1 int, args... int) (sum int) {
sum = n1
//对args遍历
for i := 0; i < len(args); i++ {
sum += args[i]
}
//也可以使用 for--range 遍历
return
}
//测试函数的可变参数
res2 := sum(1, 2, 3, 10)
fmt.Printf("res2=%d", res2)
fmt.Println()