函数
- go的函数都是全局函数,可以被项目中的所有文件使用,所以在项目中,函数名是唯一的。
- 函数格式:
格式:
func function_name( [parameter list] ) [return_types] {
函数体
}
例如:
func max(num1, num2 int) int {
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
- 不定参数
func test(args...int){
fmt.Println(args)
//计算不定参数的长度
fmt.Println(len(args))
}
func main() {
//参数可以任意设定
test(1,2,3)
test(11,33,44,55)
}
- 函数调用:
func main() {
var a int = 100
var b int = 200
var ret int
//在主函数中,调用上方的max函数
ret = max(a, b)
fmt.Printf( "最大值是 : %d\n", ret )
}
- go函数可以返回多个值
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Google", "Runoob")
fmt.Println(a, b)
}
- 函数参数:调用函数时可以有两种传参方式
- 值传递:调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
函数定义:
func swap(x, y int) int {
var temp int
temp = x
x = y
y = temp
return temp;
}
函数调用:
swap(a,b)
- 引用传递:调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
函数定义:
func swap(x *int, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
函数调用:
swap(&a, &b)
- 函数用法
- 函数嵌套调用(不定参数传递):
func test3(a...int){
test4(a[0:]...)//从第一个参数开始,把test3的参数传给test4
test4(a[2:]...)//从第三个参数开始,把test3的参数传给test4
test4(a[:2]...)//从第一到第二个参数(到二,不包含),传给test4
test4(a[1:3]...)//顾名思义
}
- 函数作为另外一个函数的实参: 函数定义后可作为另外一个函数的实参数传入
func main(){
/* 声明函数变量 */
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x)
}
/* 使用函数 */
fmt.Println(getSquareRoot(9))
}
- 闭包: 闭包是匿名函数,可在动态编程中使用
匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
- 方法 :方法就是一个包含了接受者的函数
- 函数类型 (自定义函数类型)
func test6() {
fmt.Println("代澳旗")
}
func test7(a int,b int){
fmt.Println(a+b)
}
//type 可以定义函数类型
//type 可以为已存在胡类型起别名
type FUNCTYPE func()
type FUNCTEST func(int,int)
func main() {
//定义函数类型变量
var f FUNCTYPE
f=test6
//通过函数变量调用函数
f()
var f1 FUNCTEST
f1=test7
f1(10,20)
}
- 作用域
全局变量:在函数外部定义的变量,作用域是项目中所有文件,公共信息
全局变量在内存中数据区存储,常量在数据区中的内存区存储。
局部变量:在函数内部定义的变量,作用域限定于本函数的内部,从变量定义到本函数结束一只有效
程序中如果出现了相同的变量名,如果本函数有自己的变量,就使用自己的,如果没有就去上层寻找。如果名字相同就会采用就近原则,使用自己的变量。