暂时未有相关云产品技术能力~
6+年经验,目前从事区块链领域相关工作。
Mutex 使用非常方便,但它的内部实现却复杂的很,今天我们来介绍下它的内部实现原理。
Go 中实现的内存分配器,简单的说就是维护了一大块全局内存,每个线程(Go 中的 P)维护一小块的私有内存,当私有内存不足时再向全局申请。内存分配与 GC(垃圾回收)有密切关系。
垃圾回收(Garbage Collection,简称GC)是编程语言中自动的内存管理机制,垃圾回收,垃圾指的是不再需要的内存块,如果不及时清理就没有办法再利用。
Go-Micro是go语言开发的微服务框架
需要系统同时支持 x86_64 和 arm64。我们选择 Ubuntu 22.04 Jammy Jellyfish 桌面版(https://ubuntu.com/download/desktop),非常适合运行 Kubernetes,方便调试和测试。
Thrift 是一个轻量级、跨语言的 RPC 框架,由 facebook 开发,2007年正式开源,2008 纳入 Apache 软件基金会开源项目。
反范式化可以减少关联查询时,join表的次数
可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);可变参数在函数内部是作为切片来解析的;
Timer 是一种单一事件定时器,就是说 Timer 只执行一次就会结束。
Go语言提供了一种机制,在运行时可以更新和检查变量的值、调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射。
逃逸分析就是程序运行时内存的分配位置(栈或堆),是由编译器来确定的,而非开发者。
range 是 Go 语言用来遍历的一种方式,它可以操作数组、切片、map、channel 等。
select 是 GO 语言中用来提供 IO 复用的机制,它可以检测多个 chan 是否 ready(可读/可写)
defer 语句用于延迟函数的调用,使用 defer 关键字修饰一个函数,会将这个函数压入栈中,当函数返回时,再把栈中函数取出执行。
在 Go 中,string 不包含内存空间,它只有一个内存指针,所以 string 非常轻量,很方便进行传递且不用担心内存拷贝
iota 表示 const 声明块的行索引(下标从0开始)
struct 在声明时可以附带的 Tag。Tag 用来对字段做标记,主要用于反射场景,reflect 包提供了用来操作 Tag 的方法。
slice 切片,因为其可以方便的进行扩容、传递等,在实际应用中比数组更加灵活。
REST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性
代码规范检查,是根据 Go 语言的规范,对代码进行 静态扫描检查,这种检查和业务没有关系。 比如程序中定义了个常量,从未使用过,虽然代码运行没有什么影响,但是为了节省内存,我们可以删除它,这种情况可以通过代码规范检查检测出来。
单元测试就是对单元进行测试,一个单元可以是一个函数、一个模块等。一般测试的单元应该是一个完整的最小单元,比如一个函数。这样当每个最小单元都被验证通过,那么整个模块就都可以被验证通过。
数组被声明之后,它的大小和内部元素的类型就不能再被改变 因为在 Go 语言中,函数之间的参数传递是值传递,数组作为参数的时候,会将其复制一份,如果它非常大,会造成大量的内存浪费
在 Go 语言中,处于安全考虑,是不允许两个指针类型进行转换的,比如 *int 不能转为 *float64。
反射有两种类型 reflect.Value 和 reflect.Type ,分别表示变量的值和类型,并且提供了两个函数 reflect.ValueOf 和 reflect.TypeOf 分别获取任意对象的 reflect.Value 和 reflect.Type。
根据传入的类型申请一块内存,然后返回指向这块内存的指针
1、在Go语言中,值类型和引用类型有以下特点: a、值类型:基本数据类型,int,float,bool,string,以及数组和struct 特点:变量直接存储值,内存通常在栈上分配,栈在函数调用完会被释放
程序运行时的数据是存放在内存中的,每一个存储在内存中的数据都有一个编号,这个编号就是内存地址。我们可以根据这个内存地址来找到内存中存储的数据,而内存地址可以被赋值给一个指针。我们也可以简单的理解为指针就是内存地址。
for select 无限循环模式...
一个协程启动后,一般是代码执行完毕,自动退出,但是如果需要提前终止怎么办呢? 一个办法是定义一个全局变量,协程中通过检查这个变量的变化来决定是否退出。这种办法须要加锁来保证并发安全
除了 channel 通道,还有 sync.Mutex、sync.WaitGroup 这些原始的同步机制来,更加灵活的实现数据同步和控制并发。
进程就是一个应用程序的工作空间,比如你打开的QQ,微信,工作空间包含了该程序运行所需的所有资源。而线程是进程中的执行单位,一个进程最少有一个线程。
索引是为了提高数据查询效率的数据结构,类似于书的目录一样,可以根据目录而快速找到相关内容。
Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
RPC是远程过程调用(Remote Procedure Call)的缩写形式,是分布式系统中不同节点间流行的通信方式。
客户端流式 RPC、双向流式 RPC
在我们的项目根下,在命令行执行 Go 语言的 gRPC 库的安装命令,如下:$ go get -u google.golang.org/grpc@v1.29.1
fmt 包含有格式化I/O函数,类似于C语言的 printf 和 scanf。主要分为向外输出内容和获取输入内容两大部分。
Go 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger。Logger 会打印每条日志信息的日期、时间,默认输出到标准错误。Fatal 系列函数会在写入日志信息后调用 os.Exit(1)。Panic 系列函数会在写入日志信息后 panic。下面详细介绍下标准库log的基本使用。
在编程过程中,我们经常会用到与时间和日期相关的各种需求,下面来介绍 Go 语言中有关时间的一些基本用法。
strconv 包实现了基本数据类型和其字符串表示的相互转换。
os 包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。
存在交叉编译的情况时,cgo 工具是不可用的。在标准 go 命令的上下文环境中,交叉编译意味着程序构建环境的目标计算架构的标识与程序运行环境的目标计算架构的标识不同,或者程序构建环境的目标操作系统的标识与程序运行环境的目标操作系统的标识不同
运行容器 docker run 命令来运行一个容器。 -d :以后台的方式启动 --name : 为启动的容器命名 docker ps 查看 Docker host中当前运行的容器 -a :显示所有状态的容器
运行容器 docker run 命令来运行一个容器。 -d :以后台的方式启动 --name : 为启动的容器命名 docker ps 查看 Docker host中当前运行的容器 -a :显示所有状态的容器
Docker的核心组件包括: Docker 客户端:Client Docker 服务器:Docker daemon Docker 镜像:Image Registry Docker 容器:Container
Go 语言打造高并发 web 即时聊天应用,主要实现功能:发送文字、表情包、图片、语音和群聊。
之前学习 websocket 基本上都是后端,开几个黑窗口来模拟消息的收发。等到自己真正实战的时候,会发现无从下手,本文会将前后端串联起来,从实战出发,分为上下文,此篇先介绍下前端的 websocket 实现及思路。
通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,可以用于在各方之间安全地将信息作为Json对象传输。
本文采用方案1进行明文密码的加密操作,Bcrypt是单向Hash加密算法,此算法对于同一个明文密码,每次生成的hash不一样,每次加密,都会采用不同的盐值来进行加密,最后返回的 hash 值包含盐值等信息的密文。
错误码标准化,接口返回错误代码,以供前端使用查看。