GO
关于学习GO中的一些知识点总结
void丿
勤于思考,善于观察,勇于创新(指希望达到的状态)
通过讲清楚一个知识来学习这个知识
展开
-
go的channel实现生产者,消费者模式
package mainimport ( "fmt" "time")/**生产者*/func Producer(queue chan int, message int) { fmt.Printf("send %d\n", message) queue <- message}/**消费者:常驻监听channel,当channel有数据时消费,类似pull的消费模式*/func Consumer(queue chan int) { for { fmt.Printf原创 2021-03-16 01:01:02 · 529 阅读 · 0 评论 -
go实现set
使用Go的内置类型map,利用其键唯一的特性实现set。因为map的本质是hash表,所以基于map实现的set也就是HashSet。(在Java中的HashSet也是用同样的道理实现)package mainimport "fmt"/**以空结构体作为map的value来实现,空结构体不占内存*/type Empty struct{}var empty Empty// Set类型type Set struct { m map[int]Empty}// 添加元素func原创 2021-02-13 00:27:47 · 2468 阅读 · 1 评论 -
go实现主go程等于其他子go程执行完毕
方法1:channel实现/**1 channel通信实现*/var sync1 = make(chan int)// 实际任务func cal(no int) { fmt.Printf("%d 计算中\n", no) sync1 <- no}func main() { count := 5 for i := 0; i < 5; i++ { go cal(i) } // 在go种,channel未关闭之前,主go程不会结束 for range sync.原创 2021-02-13 00:03:41 · 176 阅读 · 0 评论 -
Golang函数重点小结
1. 定义函数属于第一类对象,具备相同签名(参数及返回值)的视作同一类型第一类对象(first-class object)指可在运行期创建,可用作函数参数或返回值,可存入变量的实体。最常见的用法就是匿名函数函数只能判断其是否为nil,不支持其他比较操作从函数返回局部变量指针是安全的,编译器会通过逃逸分析(escape analysis)来决定是否在堆上分配内存函数内联(inline)对内存分配有一定的影响2. 参数参数都是值拷贝,区别在于拷贝目标对象,还是拷贝指针。在函数调用前,会为形参原创 2020-12-21 22:39:07 · 353 阅读 · 0 评论 -
Go的声明及执行顺序
声明顺序:在完成包的import之后,开始对常量,变量和类型的定义或声明。如果存在init函数的话,则对函数进行定义(这是一个特殊的函数,每个含有该函数的包都会先执行这个函数)。如果当前包是main包,则定义main函数。然后定义其余的函数,首先是类型的方法,接着是按照main函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序进行排序。执行顺序:按顺序导入所有被main包引用的其他包,然后再每个包中执行如下②③④流程。如果该包又导入了其他包,则从第一步开始递归执行,但原创 2020-11-25 22:56:24 · 616 阅读 · 0 评论 -
主流的四种并发实现模型
主流的四种并发实现模型多进程多线程基于回调的非阻塞/异步IO协程多进程多进程是在操作系统层面进行并发的基本模式。同时也是开销最大的模式。在Linux平台上,很多工具链正是采用这种模式在工作。比如某个Web服务器,它会有专门的进程负责网络端口的监听和连接管理,还会有专门的进程负责事务和运算。这种方法的好处在于简单,进程间互不影响,坏处在于系统开销大,因为所有的进程都是由内核管理的,进程间的切换会导致频繁的上下文切换。多线程多线程在大部分操作系统上都属于系统层面的并发模式,也是我们使用最多的最有效的一种原创 2020-11-15 14:34:27 · 672 阅读 · 0 评论