GO语言学习笔记3——语句函数

goland函数特点

  • 不支持重载,一个包不能有两个名字一样的函数
  • 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
  • 匿名函数
  • 多返回值

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import "fmt"
func add(a,b int) int{
return a+b
}
func main(){
c:=add
fmt.Println(c) //函数地址
fmt.Println(add)//函数地址
sum :=c(19,20)
fmt.Println(sum)
}
1
2
3
4
5
6
7
8
9
10
11
12
type add_func func(int,int) int
func operator(op add_func,a int,b int) int{
return op(a,b)
}
func main(){
c := add
fmt.Println(c)
sum := operator(c,100,200)
fmt.Println(sum)
}

需要注意的地方:

函数值之间不可以比较,函数值只可以和nil作比较,函数类型的零值是nil

函数值类型不能作为map的key

函数参数传递方式

  • 值传递
  • 引用传递(地址传递,要加&)

无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值得拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。

注意:

明确规定,如果一个类型名本身就是一个指针的话,是不允许出现在接收器中的。

1
2
3
4
5
6
7
8
9
10
11
12
type littleGirl struct {
Name string
Age int
}
type girl *littleGirl
func (this girl) changeName(name string) {
this.Name = name
}
是无法通过编译的

命名返回值名称

命名返回值的名字,需要用括号括起来,并且相当于已声明,不必重复声明,当函数直接return时,会自动返回已经声明的命名可返回值。

例:

1
2
3
4
func add(a,b int)(s int){
s = a + b //这里直接使用s
return //这里直接返回即可返回s
}

defer关键字

defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式:

1
2
3
4
5
f,err := os.Open(filename)
if err != nil {
panic(err)
}
defer f.Close()

如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。

一般清理资源,资源释放的工作放在defer运行

不过如果对defer的了解不够深入,使用起来可能会踩到一些坑,尤其是跟带命名的返回参数一起使用时。在讲解defer的实现之前先看一看使用defer容易遇到的问题。

defer使用时的坑

defer是在return之前调用的。因此可能有机会改变最终的返回值。

内置函数

Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。

名称 说明
close 用于管道通信
len、cap len 用于返回某个类型的长度或数量(字符串、数组、切片、map 和管道);cap 是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
new、make new 和 make 均是用于分配内存:new 用于值类型和用户定义的类型,如自定义结构,make 用于内置引用类型(切片、map 和管道)。它们的用法就像是函数,但是将类型作为参数:new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址,也就是指向类型 T 的指针(详见第 10.1 节)。它也可以被用于基本类型:v := new(int)。make(T) 返回类型 T 的初始化之后的值,因此它比 new 进行更多的工作(详见第 7.2.3/4 节、第 8.1.1 节和第 14.2.1 节)new() 是一个函数,不要忘记它的括号
copy、append 用于复制和连接切片
panic、recover 两者均用于错误处理机制
print、println 底层打印函数(详见第 4.2 节),在部署环境中建议使用 fmt 包
complex、real imag 用于创建和操作复数(详见第 4.5.2.2 节)

本文标题:GO语言学习笔记3——语句函数

文章作者:Yang Shuai

发布时间:2019年06月09日 - 17:06

最后更新:2019年06月09日 - 17:06

原始链接:https://ysbbswork.github.io/2019/06/09/GO语言学习笔记3——语句函数/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!