这里我们探讨的信号不是手机信号,也不是Wifi、蓝牙等信号。信号是 Linux、Unix以及其他 POSIX 兼容的操作系统中进程间通讯的一种机制,用于告知进程一个事件已经发生。
更准确的来说,这里所说的信号是在 Linux 系统中通过kill及其相关命令向指定进程发送的控制信号。在 Go 应用开发中,正确处理这些信号非常有必要。
在 Linux 操作系统中系统信号很多类型,这里简要列一些常用的系统信号:
这里我们探讨的信号不是手机信号,也不是Wifi、蓝牙等信号。信号是 Linux、Unix以及其他 POSIX 兼容的操作系统中进程间通讯的一种机制,用于告知进程一个事件已经发生。
更准确的来说,这里所说的信号是在 Linux 系统中通过kill及其相关命令向指定进程发送的控制信号。在 Go 应用开发中,正确处理这些信号非常有必要。
在 Linux 操作系统中系统信号很多类型,这里简要列一些常用的系统信号:
在使用 Golang 做并发编程的过程中,锁是开发中必不可少的工具之一,它可以避免多协程对共享资源的并发读写,通过加锁来解决对共享资源的并发控制。
在 Go 语言中提供了互斥锁sync.Mutex{}和读写锁sync.RWMutex{}。他们都实现了sync.Locker接口:
// A Locker represents an object that can be locked and unlocked.
type Locker interface {
Lock()
Unlock()
}
在使用 Golang 做编程的学习和工作中,经常会将一个项目拆分成多个模块,模块之间保持着一定层级的依赖关系。往往修改完上游模块后,必须发布以后,下游模块更新后才能使用修改后的上游模块,如果在下游模块使用时发现问题需要再次修改上游模块,然后再发布,下游模块再更新,如此往复,费时费力,大大降低开发和调试效率。
工作区(workspaces) 模式是 Go1.18 中引入的新功能,让多个模块并行开发和调试。无需在 go.mod 中使用 replace 来本地使用开发上游模块。
在没有工作区之前,假设有两个模块mod1和mod2,mod1依赖mod2,如果mod2中做了修改,mod1要想使用mod2修改后的功能,有两种方式:
游戏的种类也很多,各种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加密解密。
包管理工具已是编程语言的必备的工具,用于解决项目中复杂的依赖关系,提供包的版本控制、安装、更新等工具。Java 中有 Maven,Python 中的 pip,还有 PHP 中 composer 等,那么 Go 目前已经有非常成熟的包管理工具:go mod。
在一个还没有使用go mod的项目中,需要使用go mod init初始化。
go mod init example.com/group/demo
微服务是一种软件技术架构,是将一个大型的单个应用或服务拆分成多个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级需求。
Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具,是一个 Web 应用程序框架,具有富有表现力、优雅的语法。
它致力于给开发者提供完整的微服务研发体验,通过整合,可以产出一套完整的微服务治理体系,从而让开发者更加专注于业务交付。
在工作中,经常需要查看一些应用程序的版本,使用-v、--vserion等参数查看一个应用的版本,比如:
# node -v
v16.13.1
# go version
go version
go version go1.12.9 linux/amd64
那通过go build构成后生成的可执行文件,如果获取它的版本呢?
随着互联网的高速发展,人们对安全的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA加解密。
在Go语言中实现RSA加解密还是比较简单的,网上很多教程都是基于Go原生标准库写的,代码量较多。这里分享一个好用的库:https://github.com/forgoer/openssl 。
go get https://github.com/forgoer/openssl
HmacSHA256加密算法比较常用的加密算法之一,它比MD5更加安全。HmacSHA256也是微信支付推荐的加密方式。
在Go语言中实现HmacSHA256还是比较简单的,虽然没有PHP的hash_hmac一个函数搞定的方式简单,但比起Java中的实现还是简单不少。
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
)
// HmacSha256 计算HmacSha256
// key 是加密所使用的key
// data 是加密的内容
func HmacSha256(key string, data string) []byte {
mac := hmac.New(sha256.New, []byte(key))
_, _ = mac.Write([]byte(data))
return mac.Sum(nil)
}
// HmacSha256ToHex 将加密后的二进制转16进制字符串
func HmacSha256ToHex(key string, data string) string {
return hex.EncodeToString(HmacSha256(key, data))
}
// HmacSha256ToHex 将加密后的二进制转Base64字符串
func HmacSha256ToBase64(key string, data string) string {
return base64.URLEncoding.EncodeToString(HmacSha256(key, data))
}
func main() {
// secret 是加密要使用的key
// apple 是要加密的内容
fmt.Printf("HmacSha256转16字符串: %s\n", HmacSha256ToHex("secret", "apple"))
fmt.Printf("HmacSha256转base字符串: %s\n", HmacSha256ToBase64("secret", "apple"))
}
随着Go语言的快速发展,以及其卓越的性能优势,有不少PHP项目转换为Go语言,那么php独有的serialize()和unserialize()数据,在Go语言怎么解析呢?
其实只要找到php中序列化的编码规则,就可以用Go去实现序列化和反序列了。
在Github上已经有实现的库了,https://github.com/leeqvip/gophp 。
Go语言中并没有提供内置函数来删除切片,熟悉Java/PHP的都知道,在Java/PHP中都提供对list或数组的filter操作,那么在Go语言中就需要多用几行代码来实现删除切片中的指定元素了。
假设有个1~9的数组,要删除掉其中的偶数,那么这里先进行for循环,依次判断元素是否为偶数,然后将偶数的元素通过索引截取掉,下标i向左移动一位。
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i := 0; i < len(numbers); i++ {
if numbers[i]%2 == 0 { // 如果是偶数就删除
// 通过截取删除
numbers = append(numbers[:i], numbers[i+1:]...)
i--
}
}
fmt.Println(numbers) // [1 3 5 7 9]
切片,是一组可变长度的、同类元素的集合
与数组相比切片的长度是不固定的。切片可以追加元素,在追加元素时可能使切片的容量增大。
切片在使用前必须初始化,未初始化的切片的值为nil。
数组,是一组固定长度的、同类元素的集合。
固定长度,声明时指定长度,长度不可以改变。
同类元素,数组中的元素必须是同一类型的
在日常项目开发中,经常需要判断一个文件的类型,比如图片上传时,判断一个图片是否是jpg、png等。
如果单纯更改文件名的后缀取判断,这并不推荐,因为文件的后缀是可以随便修改的,如果是恶意程序伪装成.jpg图片上传,那会存在很大的安全隐患。
判断文件的真实类型就是获取文件的MIME类型,一般获取文件内容的前几个字节就可以确定它的MIME类型了。
专业企业官网建设,塑造企业形象,传递企业价值
系统软件开发,用心思考,用心设计,用心体验
打破技术瓶颈,让不堪重负的项目起死回生
构建全渠道一体化运营能力,实现全链路数字化
文案撰写、营销策划,专注品牌全案
一站式解决企业互联网营销痛点和难题
以技术的力量,改变互联网
联系我们