函数
函数基础
函数定义
函数是组织好的、可重复使用的、用于执行指定任务的代码块。
本文介绍了 Go 语言中函数的相关内容。
package main
import "fmt"
func main() {
// 1、无参数、无返回值
fmt.Println(xxx) // 0x4a7a80
//go语言执行:执行入口在main方法
xxx()
}
// 1、定义函数(无参数、无返回值)
/*
func : 定义函数的关键字(go25个关键字)
xxx : 函数的名字(类似定义的全局变量)
*/
func xxx() {
fmt.Println("hello world")
}
函数返回值
Go 语言中通过 return
关键字向外输出返回值。
函数多返回值,Go 语言中函数支持多返回值,函数如果有多个返回值时必须用()
将所有返回值包裹起来
package main
import "fmt"
func main() {
// 2、函数参数和返回值
val := add(1, 1, "zhangsan") // val接收的是函数的返回值
fmt.Println("函数执行结果:", val)
}
// 2、两数相加:函数参数和返回值
/*
func : 定义函数的关键字(go25个关键字)
add : 函数的名字(类似定义的全局变量)
参数:x,y int
- x y : 函数参数
- int : 指定两个参数的类型(比如int、str)在调用函数时一定要使用相同的类型
返回值:(int)
- 定义这个函数,执行结束后会返回一个int类型的数据
*/
func add(x, y int, c string) int {
// x, y int 相同数据类型可以一起定义:“x,y int” 应该是 “x int ,y int” ?
// , c string 不同数据类型需要分开定义
fmt.Println("运行了add函数")
return x + y
}
函数变量作用域
全局变量
全局变量是定义在函数外部的变量,它在程序整个运行周期内都有效。
在函数中可以访问到全局变量
package main
import "fmt"
// go语言执行顺序
/*
首先执行 定义全局变量
然后执行 init方法
最后执行 main方法,调用我们写的逻辑
*/
// 1、全局变量
// 在函数外部直接定义的变量是全局变量(特点:可以在其他函数中使用)
var num int = 64
func main() {
fmt.Println("main", num) // 这里打印的是全局的num
}
局部变量
局部变量是函数内部定义的变量, 函数内定义的变量无法在该函数外使用
例如下面的示例代码 main 函数中无法使用 testLocalVar
函数中定义的变量 x
package main
import "fmt"
// go语言执行顺序
/*
首先执行 定义全局变量
然后执行 init方法
最后执行 main方法,调用我们写的逻辑
*/
// 1、全局变量
// 在函数外部直接定义的变量是全局变量(特点:可以在其他函数中使用)
var num int = 64
func main() {
TestFunc()
fmt.Println("main", num) // 这里打印的是全局的num
//fmt.Println(num2) // 局部变量在函数内部生效,不能在其他函数调用
}
func TestFunc() {
fmt.Println(num) // 全局变量可以在其他函数中使用
// 2、局部变量(在函数内部定义的变量,不能在其他函数中访问)
var num2 int = 1000
fmt.Println(num2)
}
for
循环语句中定义的变量
我们之前讲过的 for 循环语句中定义的变量,也是只在 for 语句块中生效
package main
import "fmt"
// go语言执行顺序
/*
首先执行 定义全局变量
然后执行 init方法
最后执行 main方法,调用我们写的逻辑
*/
// 1、全局变量
// 在函数外部直接定义的变量是全局变量(特点:可以在其他函数中使用)
var num int = 64
func main() {
TestFunc()
fmt.Println("main", num) // 这里打印的是全局的num
//fmt.Println(num2) // 局部变量在函数内部生效,不能在其他函数调用
}
func TestFunc() {
// 3、for循环中定义的变量
for i := 1; i < 10; i++ {
fmt.Println(i)
}
//fmt.Println(i) // 在for后面定义的变量是自己这个代码块的,在外部不能使用
fmt.Println("test", num) // 全局变量可以在其他函数中使用
num = 3000
// 局部作用域优先级更高,局部和全局定义了相同的变量名,局部在函数内部生效的,全局的被覆盖了
num := 7 // := 类似var 声明一个新的变量(在内存中开启新空间) = 是赋值
fmt.Println("test", num)
num = 444 // 函数内部如果修改,只修改的是自己,不影响全局的num
fmt.Println("test", num)
}