函数定义
函数是结构化编程的最小模块单元,使用关键字‘func’定义函数。Go语言定义函数的一些特点总结如下:
- 无需前置声明
- 不支持命名嵌套定义
- 不支持同名函数重载
- 不支持默认参数
- 支持不定长变参
- 支持多返回值
- 支持命名返回值
- 支持匿名函数和闭包
函数属于第一类对象,具备相同签名(参数及返回值类型)的视为同一类型。
定义一个函数:
func test(x int,s string)int{} //其中func为关键字,test为函数名,(x int,s string)为参数列表,int为返回值类型
package main
import(
"fmt"
)
func hello(){ //定义一个名为hello的函数,参数列表为空返回值为空
fmt.Println("hello word!")
}
func main(){ //main函数程序的入口
hello()
}
函数只能判断其是否为nil,不支持其它比较操作,从函数返回局部变量指针是安全的。
package main
import(
"fmt"
)
func test()*int{
a := 10
return &a
}
func main(){
var a *int = test()
fmt.Println(a,*a)
}
输出:
0xc04203e1d0 10
参数
Go语言不支持有默认值得可选参数,不支持命名实参。调用时,必须按签名顺序传递指定类型和数量的实参,就算以“_”忽略的也不能省略掉。
不管是指针、引用类型,还是其他类型参数,都是值拷贝传递。如果函数参数过多,建议将其定义为一个复合结构类型。
变参
变参本质上就是一个切片。只能接受一个到多个同类型参数,并且放在列表尾部。
package main
import(
"fmt"
)
func test(s string,a ...int){ //定义一个不定参数的函数,注意'...'不可省略
fmt.Printf("%s,%T,%v\n",s,a,a) //输出类型及值
}
func main(){
test("adb",1,2,3,4)
}
输出:
adb,[]int,[1 2 3 4]
既然变参是切片,那么参数复制的仅是切片自身,并不包含底层数组,因此可修改原数据。如果需要可使用内置函数copy复制底层数据。
package main
import(
"fmt"
)
func test(a ...int){
for i := range