go语言自学笔记(二)

函数

函数名(参数名 参数类型,参数名 参数类型) 返回值类型 {

}
可以没有函数中的输入参数和返回值func 函数名() {

}
如果一个函数有多个返回值,那么这些返回值必须用 ( ,) 括起来。
从函数中可以返回一个命名值。一旦命名了返回值,可以认为这些值在函数第一行就被声明为变量了。
函数值
函数像其他值一样,拥有类型,可以被赋值给 其他变量,传递给函数,从函数返回。

可变参数函数

多个类型一致的参数
如果函数最后一个参数被记作 …T ,这时函数可以接受任意个 T 类型参数作为最后一个参数。 只有函数的最后一个参数才允许是可变的。
可变参数函数的工作原理是把可变参数转换为一个新的切片。无法直接将一个切片传给一个可变参数函数。如果在切片后加上 … 后缀,切片将直接传入函数,不再创建新的切片。
多个类型不一致的参数
可以指定类型为 …interface{},然后再for range遍历。
多个可变参数函数传递参数
可以使用 … 来解序列,将函数的可变参数(一个切片)一个一个取出来,传递给另一个可变参数的函数,而不是传递可变参数变量本身。
(此处存疑)

匿名函数

func(参数列表)(返回参数列表){

}
匿名函数可以作为一个函数对象把它赋值给一个变量,再利用变量来调用该函数,即使得函数可以像普通变量一样被传递或者使用。

闭包
当一个匿名函数所访问的变量定义在函数体的外部时,就称这样的匿名函数为闭包。

make()和new()

make()
make()能用于 slice,map 或 chan 类型,返回值不是指针是类型

new()
new ()能传递一个任意类型的参数,可以是Go语言内建类型,也可以是自定义类型,返回指针

方法

值接收器
接收器类型为 Type 的方法 :
func (接收器名 接收器类型)方法名 (参数) 参数类型{
}
相同的名字的方法可以定义在不同的类型上,而相同名字的函数是不被允许的。
指针接收器
func (接收器名 *接收器类型)方法名 (参数) 参数类型{
}
这个方法的名字叫(*接收器类型).方法名

一般来说,指针接收器可以使用在:
1.对方法内部的接收器所做的改变应该对调用者可见时。
2.当一个结构体有很多的字段时。在方法内使用这个结构体做为值接收器需要拷贝整个结构体,这是很昂贵的。在这种情况下使用指针接收器,结构体不会被拷贝,只会传递一个指针到方法内部使用。

匿名字段的方法
属于结构体的匿名字段的方法可以被直接调用

内嵌
类似于类和继承的概念

内嵌可以使我们定义字段特别多的复杂类型,我 们可以将字段先按小类型分组,然后定义小类型的方法,之后再把它们组合起来。

接口

接口就是方法签名的集合。当一个类型定义了接口中的所有方法,我们称它实现了该接口。
type interface {
方法名()
}

多态
所有实现了接口的类型,都可以把它的值保存在一个接口类型的变量中。在 Go 中,我们使用接口的这种特性来实现多态。

根据接口的具体类型,程序会调用不同的方法。

类型断言
作用:
1.检查 接口对象i 是否为 nil
2.检查 i 存储的值是否为某个类型

  1. t := i.(T)
    如果接口对象(i)存储的值的类型是 T,就会返回值给 t,如果T或为nil,就会触发 panic。

  2. t, ok:= i.(T)
    如果断言成功,就会返回其类型给 t,并且此时 ok 的值 为 true;断言失败会将 ok 的值设为 false ,此时t 为 T 的零值。

类型选择
如果需要区分多种类型,可以使用类型选择。类似switch语句。

语句

if - else 条件语句

switch - case 选择语句
switch 后面可以接一个函数,只要保证 case 后的值类型与函数的返回值一致即可。
switch 后可以不接表达式,此时,switch - case 就相当于 if - elseif - else。

当 case 使用关键字 fallthrough 时,可以穿透一层,在判断一次case。

for - range 循环语句
for [condition / ( init; condition; increment ) / Range]
{
}
遍历可以使用 for-range 的方式来实现。range 后可接数组、切片,字符串等,并返回两个值:索引和数据。

goto 无条件跳转语句
goto 可以打破原有代码执行顺序,直接跳转到某一行执行代码。

goto 标签;


标签: 表达式;

注意 goto语句与标签之间不能有变量声明

defer 延迟执行
defer xxx()
则 xxx 函数的调用延迟到当前函数执行完后再执行。

使用 defer 只是延时调用函数,此时传递给函数里的变量,不应该受到后续程序的影响。
defer 是return 后才调用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值