和返回值相关*
1.一组形参或返回值有相同的类型,我们不必为每个形参都写出参数类型。这两个声明是等价的
func f(i, j, k int, s, t string) { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... }
2.定义一个没有参数也没有返回值的函数:
func say(){
}
3.定义一个没有返回值的函数:
func say(name string){
}
4.给返回值取了名字那么在函数体中就可以直接用,并且return中不写变量
func say(a int,b int)(ret int){
ret=a+b
return
//ret:=a+b的写法是错误的,因为不用声明
//但是不能不写return
}
5.接收可变参数:固定参数和可变参数同时出现的时候,可变参数需要放在最后面,go语言中没有默认参数!!!!!
func say(a int,b ...int)int{
}
say(10) //a是10,b是空切片
say(10,20)//a是10,b=[20]
say(10,20,30)//a是10,b=[20,30]
6.函数作为参数
t的类型是fun(),可以直接这样调用t
func say(a,b int){
}
t:=say
func add(x,y int)int{
return x+y
}
func fu(x,y int,op func(int,int)int)int{
return op(x,y)
}
t:=fu(100,200)
//t输出是300
和返回值相关
1.具有多返回值
func say(a,b int)(s1,s2 int){
s1=a+b;
s1=a-b;
return
}
x,y:=say(100,200)
2.defer语句,先defer的句子最后执行,
func say(a,b int){
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
}
//执行出来321
变量
1.全局变量
函数可以访问全局变量
2.局部变量
1.全局变量和局部变量重名,局部变量优先
2.代码块内的就是代码块内为主
匿名函数
2.最后面加上圆括号就是定义并且直接执行
闭包=函数+外层变量的引用
闭包示例:不仅仅返回了内部函数还包含了外层变量的引用
r此时就相当于一个闭包
这两个name是等价的,留下来一个就ok了
方法
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。
方法的定义格式如下:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
这是函数的定义:func 函数名(形式参数列表)(返回值列表){ 函数体 }
方法跟函数比较多了一个接收者
接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为
p,Connector类型的接收者变量应该命名为c等。 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
方法名、参数列表、返回参数:具体格式与函数定义相同。
例子:
//Person 结构体
type Person struct {
name string
age int8
}
//NewPerson 构造函数
func NewPerson(name string, age int8) *Person {
return &Person{
name: name,
age: age,
}
}
//Dream Person做梦的方法
func (p Person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}
func main() {
p1 := NewPerson("小王子", 25)
p1.Dream()
}
方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。