在Go的各种框架中,总是能看见context的身影,它被用来进行数据传递、超时通知等。
context在Golang1.7的版本被引入,它被称为协程的上下文,用来在各个协程之间进行上下文信息传递,例如:取消信号、超时信号、数据传递等。这种传递不仅只传送给被调用者、context能够进行链式的调用。
总所周知,Go中内置容器Map是线程不安全的,当有多个协程同时进行操作,会抛出fatal error: concurrent map writes的错误,例如下面的例子
fatal error: concurrent map writes
12345678
func testMap() { m := make(map[string]int) for i := 0; i < 100; i++ { go func(num int) { m[fmt.Sprintf("%d", num)] = num }(i) }}
因此如果我们有多个协程同时操作map的需求,就不能直接使用map啦。通常我们可以通过加读写锁(sync.RWMutex)或者使用sync.Map来保证线程安全。
Go跟Java一样都是自动垃圾回收、简称GC,即在后台运行一个守护线程,监控各个对象的状态,识别并且释放不在使用的对象的内存空间。
目前Go使用的垃圾回收策略是三色标记法+混合写屏障,下面就来学习一下GC的细节把。
goroutine
Go中channel是一个核心类型,用于协程直接的通信以实现并发通信。
Go中对于并发编程有个核心思想:不要通过共享内存来通信,而是通过通信来共享内存,channel即是这一思想的实现。
map是Golang内置的一个键值对容器,在开发中经常用到同时API简单易用,那么它和其他语言的关于map的实现有什么不同吗?下面就来学习一下~
在学习GO语言中,有两个常用内存分配的关键字:new和make,它们都可以用来为变量分配内容。在一些面试题上也会问到它们有什么区别,那么下面就来学习一下。
这几年随着Go的发展,Go语言也是越来越火了,随意打开一个招聘软件都能发现有许多Go的招聘岗位。
Go
那么我作为一个Javaer也开始学习Go的相关知识,Go的语法并不难学甚至还比较简单,但Go的思想、项目开发却与大多数的OOP语言有些不同。下面就来我就来描述一下自己在使用Go进行项目实践开发中遇到的疑惑吧,欢迎大伙在评论区交流一下。
Javaer
OOP
1 / 2