在 Go 项目中使用go mod
作为依赖管理工具,go.mod
文件是其核心配置文件。
一般情况下,go.mod
的配置项主要有:module
go
require
,大概结构如下:
在 Go 项目中使用go mod
作为依赖管理工具,go.mod
文件是其核心配置文件。
一般情况下,go.mod
的配置项主要有:module
go
require
,大概结构如下:
提起 Go 语言中的rune
类型,相信大家对它并不陌生。虽然它并不常用,但在我的印象里,用得最多的就是用它来处理中文字符串截取。
没错,多语言的字符串处理就是rune
的强项。
rune
是 Go 的内置类型之一,占用4
个字节,通常用于表示Unicode
字符,它是int32
的别名,所以它在所有方面和int32
等价。
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
很多人都说init()
函数在 Go 语言中是一种神奇的存在,那么它到底神奇在哪里呢?这里就来聊一聊在 Go 语言中 init()
函数的作用以及它的执行顺序。
顾名思义,init
是英语单词"initialization"的缩写形式,意思是初始化的意思,用来执行一些初始化操作,它在入口函数main()
之前执行,并且一个包中甚至一个文件中,可以有多个init()
函数,没有参数和返回值。
在Go
中所说的空结构体就是struct{}
,它是一种特殊的存在,可能你在项目中看到过,但并没有深入的了解它的应用场景,这里结合自己平时项目中的经验,介绍一下空结构体(struct{})的一些应用场景。
Go
语言中的空结构体(struct{})是一种零内存占用的特殊类型,其所有实例可能共享同一内存地址(zerobase),它不包含任何字段,但却有很多应用场景。
紧接上文,这里就来验证一下,空结构体的内存地址是否相同,以及内存占用大小:
作为一个Go
开发者,内存对齐
是一个基础而又重要的概念,在日常项目中,我们经常希望提高程序性能和运行效率,那么了解Go
语言中的内存对齐原理是必要的,帮助我们合理的定义结构体
,编写出高效的应用程序。
先来看一个未经优化的结构体S1
和一个优化后的结构体S2
,并获取实际大小:
type S1 struct {
x int8 // 1个字节
y int64 // 8个字节
z int16 // 2个字节
}
type S2 struct {
x int8 // 1个字节
z int16 // 2个字节
y int64 // 8个字节
}
func main() {
fmt.Println(unsafe.Sizeof(S1{})) // output: 24
fmt.Println(unsafe.Sizeof(S2{})) // output: 16
}
可以看出,字段和类型完全相同的两个结构体,所占内存并不相同。这两个结构体仅仅只是字段的顺序不同,但所占内存却差别这么大呢?
有一天,突然在项目中看到有个clear
的函数,还以为是本地定义的函数,但在本地却没有找到相关定义。鼠标放上那么一点,才发现是Go
语言中内置的函数,恕我孤陋寡闻了。
于是,就在网上各种搜索准备一探究竟,才知道clear
函数是Go1.21
版本中引入的内置函数,一起被引入的还有max
和min
函数。
clear
主要用于清理map
和slice
的,在此之前一直没有快速清理map
和slice
的办法,例如清空map
中的元素往往需要通过for
遍历并通过delete
去删除元素。
越来越多的开发者开始使用Go
语言开发,这其中不乏有PHP
、Python
、Java
的,还有C
和C++
转Go
的,技术功底可谓是鱼龙混杂、良莠不齐。无论是从小白入门还是直接上手做项目,如果要真正掌握一门编程语言,基本功
早晚都要练的。
言归正传,在Go
语言中有两个用来内存分配的内置函数:new
和make
。经历了很多项目,发现make
的使用频率要远高于new
,实际开发中make
几乎是无可代替,之所以new
的使用频率没那么高,是因为它有几种可以代替的编写方式。虽然都用于内存分配,但它们还是有一些区别,所以应用场景也各不相同。
new
就是纯用来内存分配的,它返回的是被分配类型的指针,并初始化为该类型的零值
。
在面向对象编程中,接口
是一个重要概念,它是一种契约
,它定义了对象应该具备的方法。一个接口
可以有多重实现,它的所有实现都必须满足接口
所有约定的方法。并不是所有编程语言都有接口,例如在C
、Python
、Ruby
中是没有内置的接口机制,但在大多数编程语言中都有接口
的概念,一般用interface
来标记。
Java
和Go
都是有内置的接口
的机制,但在接口实现上却不尽相同。这些区别主要是接口定义、接口实现、约束机制和应用场景等方面,下面就这些不同进行逐一比较。
两者在接口定义上区别不大,都是通过interface
实现的。
在Java
中接口的定义:
这里我们探讨的信号不是手机信号,也不是Wifi、蓝牙等信号。信号是 Linux、Unix以及其他 POSIX 兼容的操作系统中进程间通讯的一种机制,用于告知进程一个事件已经发生。
更准确的来说,这里所说的信号是在 Linux 系统中通过kill
及其相关命令向指定进程发送的控制信号。在 Go 应用开发中,正确处理这些信号非常有必要。
在 Linux 操作系统中系统信号很多类型,这里简要列一些常用的系统信号:
在使用 Golang 做并发编程的过程中,锁
是开发中必不可少的工具之一,它可以避免多协程对共享资源的并发读写,通过加锁来解决对共享资源的并发控制。
在 Go 语言中提供了互斥锁sync.Mutex{}
和读写锁sync.RWMutex{}
。他们都实现了sync.Locker
接口:
在使用 Golang 做编程的学习和工作中,经常会将一个项目拆分成多个模块,模块之间保持着一定层级的依赖关系。往往修改完上游模块后,必须发布以后,下游模块更新后才能使用修改后的上游模块,如果在下游模块使用时发现问题需要再次修改上游模块,然后再发布,下游模块再更新,如此往复,费时费力,大大降低开发和调试效率。
工作区
(workspaces) 模式是 Go1.18 中引入的新功能,让多个模块并行开发和调试。无需在 go.mod
中使用 replace
来本地使用开发上游模块。
游戏的种类也很多,各种3A大作、手机游戏、小游戏等。就游戏服务端而言,由于游戏本身差异,很难有一个大而全的游戏服务端框架,为满足日益变化的业务需求,很多企业都是自主开发定制自己的框架,或者从很小的一个http+rpc
基础开始,不断扩展来满足的各自的业务需求。
非要说推荐几个Golang
的游戏服务端框架,也不是没有,这里更加Gibhub
的 star 数来推荐几个还不错的框架。
下面这些都是有一定 star 并且还在活跃的项目:
AES
(高级加密标准),是一种对称加密算法,由美国国家标准与技术研究院(NIST)于2001年发布,用于取代早期的DES加密算法,支持128位、192位和256位密钥长度,广泛应用于数据安全领域。
相比其他的对称加密如DES,由于DES密钥长度只有56位如今的算力甚至可以在5分钟内破解,而AES最高级别达到了256位密钥长度,如果采用穷举法,目前来看AES是一种”无法“被破解的加密存在。
不过在 Go 中通常需要使用crypto/aes
和crypto/cipher
包实现AES加密解密。
这里推荐一个开源的AES
加解密库,只需要一行代码即可快速完成加密或解密
包管理工具已是编程语言的必备的工具,用于解决项目中复杂的依赖关系,提供包的版本控制、安装、更新等工具。Java
中有 Maven
,Python
中的 pip
,还有 PHP
中 composer
等,那么 Go 目前已经有非常成熟的包管理工具:go mod。
在一个还没有使用go mod
的项目中,需要使用go mod init
初始化。
微服务是一种软件技术架构,是将一个大型的单个应用或服务拆分成多个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级需求。
Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具,是一个 Web 应用程序框架,具有富有表现力、优雅的语法。
专业企业官网建设,塑造企业形象,传递企业价值
系统软件开发,用心思考,用心设计,用心体验
打破技术瓶颈,让不堪重负的项目起死回生
构建全渠道一体化运营能力,实现全链路数字化
文案撰写、营销策划,专注品牌全案
一站式解决企业互联网营销痛点和难题
以技术的力量,改变互联网
联系我们