随笔分类 - go语言问题集
摘要:goroutine调度器的 Q&A go栈和用户栈如何切换 goroutine如何退出 main goroutine执行完毕后整个进程退出,其它子goroutine也就结束了 goroutine调度时机有哪些 goroutine和线程的区别 从三个角度比较goroutine和tread的区别:内存消
阅读全文
摘要:GC的认识 Q&A 什么是GC,有什么作用? GC全称garbage collection, 即垃圾回收,是一种自动内存管理的机制 当程序向操作系统申请的内存不在需要时,垃圾回收主动将其回收并供其它代码申请内存时复用,或者归还给操作系统 这种针对内存级别资源的自动回收过程,称为垃圾回收,而负责垃圾回
阅读全文
摘要:go中逃逸分析是怎么进行的 变量逃逸的基本原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸 简单来说编译器会分析代码的特征和代码的生命周期,go中的变量只有在编译器可以证明函数返回后不会再被引用的, 才会被分配到栈上,其它情况都分配到堆上 go语言中没有一个关键字或者函数可以直接让变量被
阅读全文
摘要:反射的 Q&A 概念 在go语言中,reflect可以用来在运行期间获取对象的类型信息和内存结构,reflect操作所需的全部信息都来自接口变量 接口变量除了保存自身的类型以外,还会保存实际对象的类型数据,reflect通过TypeOf函数和ValueOf函数, 将任何传入的对象都转换为接口类型 使
阅读全文
摘要:数组与切片 的 Q&A 切片作为函数参数 type slice struct { array unsafe.Pointer len int cap int } slice其实是一个结构体,包含三个成员,len、map、array,分别表示长度、容量和底层数组的地址 当slice作为函数参数时,就是一
阅读全文
摘要:标准库 unsafe 的 Q&A go指针和 unsafe.Pointer有什么区别? 1. go语言的作者ken thompson也是c语言的作者,所以go可以看做c系语言,它的很多特性和c类似, 指针就是其中之一,然而go语言的指针相比c语言的指针又很多限制,当然也是为了安全考虑, 相比于c语言
阅读全文
摘要:标准库 context Q&A 参考文档 context如何被取消 1. context.Context讲解 type Context interface { // 返回context是否会被取消,以及自动取消时间 Deadline() (deadline time.Time, ok bool) /
阅读全文
摘要:interface Q&A Go接口与C++接口有何异同? 1. 接口定义了一种规范,描述了类的行为和功能,而不做具体实现 2. C++定义的接口称为侵入式,而go中的接口为非侵入式,不需要显示声明,只需要实现接口定义的函数,编译器会自动识别 案例 type Animal interface { R
阅读全文
摘要:map的Q&A 非常重要的一点:makemap()函数返回的是*hmap, makeslice()函数返回的是slice map是线程安全的吗?(map可以并发写入吗) 1. go语言中内置的map不是并发安全的 2. 大量goroutine并发写入map就会报错:fatal error: conc
阅读全文
摘要:channel Q&A 什么是CSP? 不要通过共享内存来实现通信,而要通过通信实现共享内存 CSP通常被认为go在并发上成功的关键因素 go一开始就把CSP的思想融入到语言的核心里,所以并发编程称为go的一个独特的优势 大多数编程语言的并发模式是基于线程和内存同步访问控制实现的,Go的并发编程模型
阅读全文
摘要:关于channel的happened-before有哪些 1. 第 n 个 send 一定 happened before 第 n 个 receive finished,无论是缓冲型还是非缓冲型的 channel。 2. 对于容量为 m 的缓冲型 channel,第 n 个 receive 一定 h
阅读全文
摘要:就是说 channel 的发送和接收操作本质上都是 “值的拷贝”,无论是从 sender goroutine 的栈到 chan buf,还是从 chan buf 到 receiver goroutine,或者是直接从 sender goroutine 到 receiver goroutine。 pa
阅读全文