Go语言

通道是一种数据结构,可以让 goroutine 之间进行安全的数据通信。通道可以帮用户避免其他语言里常见的共享内存访问的问题。

需要强调的是,通道并不提供跨 goroutine 的数据访问保护机制。如果通过通道传输数据的一份副本,那么每个 goroutine 都持有一份副本,各自对自己的副本做修改是安全的。当传输的是指向数据的指针时,如果读和写是由不同的 goroutine 完成的,每个 goroutine 依旧需要额外的同步动作。

1. := 声明只能出现在函数或方法内

2. 字符串,不能通过索引修改某字节单元的值 str[3] = 'a' //error
    对于字符串的切片操作的返回值仍然是字符串而非切片 c := str[1:]

3. 在赋值语句中,*T出现在 = 左边表示指针声明,出现在右边表示取指针指向的值。
    函数中,允许返回函数局部变量的地址。

4. 数组是值类型的,赋值或作为函数参数都是值拷贝。
    切片是引用类型,传参是传地址,增加元素 append(slicename, value)

5. map也是一种引用类型,键值对元素是无序的,删除元素用delete(mapname,key)

6. 函数也是一种类型,可以使用type定义函数类型,函数类型变量可以作为函数的参数或返回值
   匿名函数可以直接赋值给函数变量,可以当作实参,可以作为返回值,还可以直接被调用

7. defer后面必须是函数或方法,当主动调用os.Exit(int)推出进程时,defer不会执行

8. 闭包是由匿名函数中引用外部函数的局部变量或包全局变量构成,闭包函数共享外部引用

9. GO的面向对象没有类的概念,取而代之的是结构struct

10. 预声明类型和简单类型是同一个概念, 包括:

bool,int(int8,int16...,uint,uint8...),float32(float64),complex32(complex64),byte(rune),string,error
    自定义类型 type new_type old_type(old_type为预声明类型|类型字面量|自定义类型)
    预声明类型和自定义类型合为命名类型
    未命名类型、类型字面量、复合类型是同一个概念,array,slice,map,pointer,channel,struct,interface,function
    底层类型,预声明类型和类型字面量的底层类型就是本身,自定义类型newtype的底层类型,是向oldtype向下递归查找直到是预声明类型或类型字面量

11. 为类型增加方法是实现面向对象的基础
    struct的匿名字段,必须是命名类型或命名类型指针,类型字面量不能作为匿名字段使用,结构体中不能同时存在某一类型及其指针类型的匿名字段
    使用type定义的新类型不会继承原有类型的方法,只保留底层类型的操作,如等号赋值int,迭代元素slice,,但struct结构类型可以调用嵌入字段
类型的方法,这就是GO的“继承”

12. 函数类型:函数字面量类型(未命名类型),函数命名类型
    函数字面量类型:语法表达式为 func (InputTypeList) (OutputTypeList),
    函数字面量类型包括:有名函数,匿名函数:在定义时使用func ()语法格式,没有指定函数名
    函数命名类型:简称函数类型,定义 type NewFuncType FuncLiteral(函数字面量类型)
    函数签名:是函数的“字面量类型”,不包括函数名,不同于带函数名的函数声明,
    可以为有名函数类型添加方法,提供一种装饰设计模式。

13. 接口:只有值和类型的概念,只有声明没有实现,所以定义一个新接口,又是声明一个新接口,定义接口和声明接口代表相同的意思。
    空接口, interface{},由于方法集为空,所以任意类型都认为实现了空接口,任意类型的实例都可以赋值或传递给空接口
    接口类型:接口字面量类型 interface { MethodSignature },接口命名类型 type Inter1 { MethodSignature }
    接口{}中可以是方法声明的集合,也可以嵌入另一个接口类型匿名字段
    声明接口类型:一般以"er"结尾;接口定义的内部方法声明不需要func引导;只有方法定义,没有方法实现
    接口类型断言:o,ok := i.(TypeName) i是接口变量,TypeName可以是接口类型名,也可以是具体类型名
    接口类型查询:switch v := i.(type) { case type1: xxxx } i是接口类型,case后面可以跟接口类型名,也可以跟非接口类型名,fallthrough不
能在Type Switch语句中使用

14. GO语言并发goroutine: go 关键字 + 函数调用 ,go的执行是非阻塞的,函数的返回值会被忽略,不能保证多个goroutine的执行次序
    为main函数单独创建一个goroutine,与go关键字创建的平等的被调度
    chan 关键字,通道: c := make(chan int) ,多个goroutine间的通信、同步和协同, “不要通过共享内存来通信,而是通过通信来共享内存”
    异常操作chan ,panic:向已经关闭的通道写数据;重复关闭已经关闭的通道;
                               阻塞 :向未初始化的通道读写数据会永久阻塞;向缓冲区已满的通道写数据;读取没有数据的通道;
                           非阻塞 :读取已经关闭的通道,会立即返回零值;向没有满缓冲区的通道读写都不会阻塞。
    sync.WaitGroup :Add() Done() Wait()
    select 多路复用,用于多路监听多个通道,没有状态是可读可写的,就阻塞;有一个可读或可写,进入处理分支流程;有多个,则随机选取一个处理
    退出通知机制:关闭select监听的某个通道能使select立即感知这种通知,然后进行相应的处理
    并发范式:生成器,管道,每个请求一个goroutine,固定worker工作池,future模式
    context包

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值