随笔分类 - go学习笔记
记录学习go历程
摘要:通道 Go鼓励使用CSP(Communicating Sequential Process) 作为CSP核心,Channel是显式的,要求操作双方必须知道数据类型和具体通道,并不关心另一端操作者的身份和数量。如果另一端未准备妥当,或消息未能及时处理时,会阻塞当前端 从底层实现上来说,通道只是一个队列
阅读全文
摘要:并发和并行的区别 并发:逻辑上具备同时处理多个任务的能力(片面理解:多个进程来回切换执行,用户感知到多个程序同时执行一样) 并行:物理上在同一时刻执行多个并发任务(片面理解:多核cpu分别同时执行多个线程,真正的同时执行) 并行是并发设计的理想执行模式 多线程或多进程是并行的基本条件,但单线程也可用
阅读全文
摘要:接口定义 接口代表一种调用契约,是多个方法声明的集合 Go接口实现机制很简洁,只要目标类型方法集合包含接口声明的全部方法,就被视为实现了该接口,无须做显式声明。 目标类型可实现多个接口 接口的限制 不能有字段 不能定义自己的方法 只能声明方法,不能实现 可嵌入其他接口类型 接口通常以er作为名称后缀
阅读全文
摘要:方法和函数一样,可以直接调用,还可以赋值给变量,或作为参数传递。依照具体引用方式的不同,可分为expression和value两种状态 method expression(方法表达式) 通过类型引用的 method expression 会被还原为普通函数样式,receiver是第一参数,调用时须显
阅读全文
摘要:方法是与对象实例绑定的特殊函数 方法和函数定义语法区别的在于前者有前置实例接收参数(receiver),编译器以此确定方法所属类型。 可以为当前包,以及除接口和指针以外的任何类型定义方法 type N int func (n N) toString() string { return fmt.Spr
阅读全文
摘要:结构体(struct)将多个不同类型命名字段序列打包成一个复合类型 字段名唯一,可用"_"补位,字段名排列顺序属于类型组成部分 type node struct { _ int name string age byte } func main() { n1 := node{ name: "wang"
阅读全文
摘要:字典(map) 字典要求key必须是支持相等运算符(==、!=)的数据类型,比如:数字、字符串、指针、数组、结构体、接口类型 字典是引用类型,创建字典有两种方式:a-make函数 b-初始化表达式 func main() { //make函数方式创建map m := make(map[string]
阅读全文
摘要:字符串 字符串是不可变字节(byte)序列 字符串默认值是"",而不是nil 使用反引号"`"定义不做转义处理的原始字符串,支持跨行 func main() { s := `hello \r\n, line 2` println(s) /* hello \r\n, line 2 */ } 编译器不会
阅读全文
摘要:go函数特点 无须前置声明 不支持命名嵌套定义 不支持同名函数重载 不支持默认参数 支持不定长变参 支持多返回值 支持命名返回值 支持匿名函数和闭包 func只能判断其是否为nil,不支持其它比较操作 package main func main() { println(a == nil) //fa
阅读全文
摘要:硬件的方向是物理,软件的结局是数学 go语言仅25个保留关键字 无显式类型声明的常量,那么该常量操作数会自动转型 package main import "fmt" func main() { const v = 20 //无显式类型声明的变量 fmt.Printf("%T,%v\n", v, v)
阅读全文
摘要:我们声明的变量是一个易于阅读的名字,用来表示这段内存。实际上,编译后的机器码不使用变量名,而是直接通过内存地址来访问目标数据。 函数外声明变量,不能使用简短模式(go a:=10 )。 简短模式并不总是重新定义变量,也可能部分退化成赋值操作,前提是最少有一个新变量被定义,且必须是同一作用域。在处理函
阅读全文
摘要:第一章概述了go的简单用法 值得看的就是CSP(Communicating Sequential Process 通信顺序进程)模型 package main import "time" func main() { //阻塞主进程 done := make(chan bool) //数据传输 dat
阅读全文