go语言函数

普通函数形式:
func 函数名(形式参数列表)(返回值列表){
函数体
}

和返回值相关*

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.代码块内的就是代码块内为主


匿名函数

匿名函数的使用
1.将匿名函数赋值给变量
go语言函数_第1张图片

2.最后面加上圆括号就是定义并且直接执行

go语言函数_第2张图片

闭包=函数+外层变量的引用

首先了解我们把函数作为返回值
go语言函数_第3张图片

闭包示例:不仅仅返回了内部函数还包含了外层变量的引用
go语言函数_第4张图片
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()
}

方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。

你可能感兴趣的:(go笔记,golang)