定义
1. 无参数无返回值
func 函数名(){
函数体
}2. 有参数有返回值并且指定变量名
func 函数名(参数 数据类型)(返回值 数据类型){
函数体
}3. 有参数有返回值不指定的变量名
func 函数名(参数 数据类型) 数据类型 {
函数体
}4. 相同数据类型简写
func 函数名(参数1, 参数2 数据类型)(返回值1, 返回值2 数据类型){
函数体
}5. 相同数据类型不定长参数
func 函数名(参数 ...数据类型) 数据类型 {
函数体
}package main
import"fmt"funcf1(){// 无参数无返回值
fmt.Println("this is f1")}funcf2(x int)(y int){// 有参数有返回值,并命名
fmt.Printf("this is f2, args: %d\n", x)return x
}funcf3(x int)int{// 不命名
fmt.Printf("this is f3, args: %d\n", x)return x
}funcf4(x, y int)(a, b int){// 相同类型简写
fmt.Printf("This is f4, args: %d, %d\n", x, y)return x, y
}funcf5(x ...int)int{// 不定长
sum :=0
fmt.Printf("this is f5, args: %v\n", x)for_, value :=range x {
sum += value
}return sum
}funcmain(){f1()
fmt.Printf("return: %d\n",f2(123))
fmt.Printf("return: %d\n",f3(456))
x1, x2 :=f4(123,456)
fmt.Printf("return: %d, %d\n", x1, x2)
fmt.Printf("return: %d\n",f5(1,2,3,4,5,6,7,8,9))}
输出:
this is f1
this is f2, args:123return:123
this is f3, args:456return:456
This is f4, args:123,456return:123,456
this is f5, args:[123456789]return:45
1.2 匿名函数
匿名函数
func(参数 数据类型)(返回值 数据类型){
函数体
}package main
import"fmt"funcf1()func(){
fmt.Println("this is f1")returnfunc(){// 匿名函数
fmt.Println("this is ff1")}}funcmain(){f1()()}
输出:
this is f1
this is ff1
1.3 闭包函数
闭包
func 函数名(参数 数据类型)(函数类型){
变量名:=变量值
returnfunc(参数 数据类型)(返回值 数据类型){
函数体
}}package main
import"fmt"funcf1(x, y int)func()int{returnfunc()int{return x + y
}}funcmain(){
fmt.Println(f1(1,2)())}
输出:
3
1.4 defer
return执行时机
返回值赋值 -> 运行defer-> RET指令
defer执行顺序:从下至上
package main
import"fmt"funcf1(){
fmt.Println("this is f1")defer fmt.Println("defer 1")defer fmt.Println("defer 2")
fmt.Println("f1 done")}funcmain(){f1()}
输出:
this is f1
f1 done
defer2defer1
1.5 递归
package main
import"fmt"funcf1(n int)int{if n ==1{return1}return n *f1(n-1)}funcmain(){
fmt.Printf("return: %d\n",f1(5))}
1.6 内置函数
函数
描述
close
主要用来关闭channel
len
用来获得长度
new
用来分配内存,主要是值类型:int、string、struct … 返回对应类型的指针
make
用来分配内存,主要是引用类型:slice、map、chan … 返回对应类型
append
用来追加元素到数组、slice中
panic/recover
用来做错误处理
2 结构体
2.1 类型别名
类型别名是取一个别名,实际还是原来的数据类型
type 别名 = 数据类型
typebyte=uint8typerune=int32
2.2 自定义类型
基于数据类型创建一个新的数据类型
type 自定义类型 数据类型
type myInt int
2.3 结构体定义
类型名在同一个包内不可重复
字段名在结构体内必须唯一
名称首字母大写表示公开属性外部可以访问, 小写表示私有属性外部无法访问
type 类型名 struct{
字段名 字段类型
字段类型 // 匿名字段,每个类型只能存在一个, 通过点字段类型赋值取值...}
匿名结构体
var 变量名 struct{
字段名 字段类型
...}type person struct{
name string
age uint8}var animal struct{
name string
age uint8}