摘要:摘要:今天我们来学习一下 golang 中的反射,这个是 golang 语言中的一大利器。 什么是反射 Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制 --《Go 语言圣经》 为什么要用反射 需要使用反射的两个常见场景
阅读全文
摘要:摘要:今天面试中,面试官让写使用 goroutine 交替打印字符 ABC,没有写出来,所以今天总结一下: 在学习操作系统信号量章节的时候,我们知道用信号量可以实现同步和互斥问题,比如著名的生产者和消费者问题,读者写者问题以及哲学家就餐问题。一般情况下: 把初始化信号量设置为0,用于解决互斥问题 把
阅读全文
摘要:摘要:今天我们来学习 Golang 中的 interface 类型。 Go 的 5 个关键点 interface 是一种类型 type Animal interface { SetName(string) GetName() string } 首先 interface 是一种类型,从它的定义中就可以
阅读全文
摘要:摘要:今天我们来学习 Golang 中的 另外一种常用的数据类型,通过数据结构和源码来分析 golang 中的 map 是如何实现的。 数据结构 bucketCntBits = 3 bucketCnt = 1 << bucketCntBits // Maximum average load of a
阅读全文
摘要:摘要: 今天我们来学习 Golang 中的一个基本的数据结构 slice, 这个和 C++ 中的 vector 容器思想基本一致,是一个容量可变的数组,那我们就来看下它和 array 的区别和联系,并对其中的典型操作给出分析。 数据结构 // StringHeader is the runtime
阅读全文
摘要:摘要:由于在实习过程中,做的项目都是基于 Golang 语言,所以在面试时,面试官也一定会理所当然的问 Golang, 所以在最近一段时间,主要学习这门语言的基础知识,以及常出的面试题。 简单介绍 字符串虽然在 Go 语言中是基本类型 string, 但是它实际上是由字符组成的数组,类似于 C 语言
阅读全文
摘要:摘要:今天我们来了解一下 Golang 中的内存逃逸的概念。 引言:写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊;切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,
阅读全文
摘要:摘要:上次我们学习了 Golang 的 goroutine 调度策略,今天我们来学习 Golang 的内存管理策略。 思考内存管理如何设计 内存池 最直接的方式是调用 malloc函数,指定要分配的大小,直接向操作系统申请。问题是这种方式会涉及到用户态和内核态的切换过程,那么频繁的切换就会带来很大的
阅读全文
摘要:摘要:Go 能很好的在用户空间支持并发模型,这也是 Go 如此火热的原因,那今天我们来学习 Go 的调度机制。 数据结构 G 结构体 G 是 goroutine 的缩写,相当于操作系统中的进程控制块,在这里就是 goroutine 的控制结构,是对 goroutine 的抽象,下面是 G 的结构(只
阅读全文
摘要:摘要:今天我们来学习 Go 语言中 channel , 这是 Go 语言中非常重要的一个特性。 基础知识 创建 在使用 channel 之前需要使用 make 来创建一个 channel, 如果在使用之前没有使用 make, 则会造成死锁(原因在后面死锁部分进行说明) ch := make(chan
阅读全文
摘要:上篇博客我们学习了 Proto3 协议,今天我们来学习 gRPC 框架,这两个一般都会放在一起使用,那我们开始吧 gRPC 简介 gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。它的特点: [1]HTTP/2; [2]protobuf; [3]客户端和服务端基于同
阅读全文
摘要:由于实习项目中用的是 gRPC ,在学习 gRPC 之前,我们需要先学习一下 proto 语法 Proto Buffer 简介 proto Buffer 简单介绍 protocol buffer 是一个语言无关,平台无关,可扩展的结构化数据序列化方案,用于协议通信,数据存储和其它更多用途(这个部分在
阅读全文
摘要:Sort 包介绍 Go 语言标准库 sort 包中实现了几种基本的排序算法:插入排序、快速排序和堆排序,但是在使用 sort 包进行排序时无需具体考虑使用哪种排序方式,因为该方法会根据传入的排序的数据量来进行自动选择合适的排序算法。 func insertionSort(data Interface
阅读全文
摘要:为什么要序列化和反序列化 我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, Go 语言当然也支持所有这些编码格式。 序列化与反序列化定义 序列化 (Serialization)
阅读全文
摘要:BASE64编码概念 Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。在 Base64中可打印字符包括字母 A-Z, a-z, 数字 0-9,这样共有 62 个字符,另外两个可打印符号在不同的编码系统中不同。由于 2^6 = 64, 所以每 6 个比特为一个单元,对应某个可打印字
阅读全文