暂时未有相关云产品技术能力~
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 只执行一次就会结束。
range 是 Go 语言用来遍历的一种方式,它可以操作数组、切片、map、channel 等。
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 无限循环模式...
索引是为了提高数据查询效率的数据结构,类似于书的目录一样,可以根据目录而快速找到相关内容。
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的基本使用。
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 值包含盐值等信息的密文。
错误码标准化,接口返回错误代码,以供前端使用查看。
gorm 原来的版本已经废弃,新版本进行了迁移,地址:gorm.io/。本节主要讲解新版本。
初始化gin项目,设置 go mod GOPROXY=https://goproxy.cn,direct
Go 语言字符串的字节使用的是UTF-8编码,是一种变长的编码方式。使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
在go语言中,数组的长度是不可变的,这就导致数组在实际使用中不是很灵活,为此,设计了动态数组--Slice(切片)。
map 是一种特殊的数据类型,它是一种元素对的无序集合,元素对为 键(key)值(value) 形式。我们可以通过 key 来快速找到与之对应的 value。
接口(interface)是对其他类型行为的抽象。接口是一种约束形式,其中只包括成员函数定义,不包含成员函数实现
Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。
在 Go 语言中,提倡使用通信来共享内存,而不是通过共享内存来通信,这里的通信就是通过 channel 发送接收消息的方式进行数据传递,而不是通过修改同一个变量。
interface(接口) 类型是一种特殊的类型,interface 用来表示一组方法集合,所有实现该方法集合的类型都可以被认为是实现了该接口。所以空 interface 类型的方法集合为空,也就是说所有类型都可以认为是实现了该接口。