技术圈开发者交流群:

Go 语言中的结构体内存对齐

作为一个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
}

可以看出,字段和类型完全相同的两个结构体,所占内存并不相同。这两个结构体仅仅只是字段的顺序不同,但所占内存却差别这么大呢?

GoLang 06月07日 1686

PHP-Casbin:现代化 PHP 应用的权限管理引擎

在当今复杂的Web应用中,精细化的权限管理是保障系统安全的关键环节。PHP-Casbin 作为Casbin生态的PHP实现,凭借其灵活的模型支持和强大的扩展能力,已成为PHP开发者实现访问控制的首选工具。

PHP-Casbin 基于PERM(Policy/Effect/Request/Matcher)模型,抽象出通用的访问控制框架。

  • 模型灵活‌:通过配置文件支持自定义访问控制模型,可动态调整权限策略。
  • 多模型支持‌:内置 超级用户 管理、角色继承等功能,支持多层权限控制,支持ACLRBACABAC等数十种权限模型。 ‌
  • 轻量化设计‌:默认仅处理授权逻辑,需配合其他组件完成身份认证(如OAuth)。

适用于需要动态权限调整的系统,如API安全控制、企业内部权限管理等场景,支持通过配置快速迭代权限策略。

PHP 06月05日 698

认识 Go 语言中的 clear 函数

有一天,突然在项目中看到有个clear的函数,还以为是本地定义的函数,但在本地却没有找到相关定义。鼠标放上那么一点,才发现是Go语言中内置的函数,恕我孤陋寡闻了。

于是,就在网上各种搜索准备一探究竟,才知道clear函数是Go1.21版本中引入的内置函数,一起被引入的还有maxmin函数。

GoLang 05月01日 682

Golang 中 new 与 make 的区别及适用场景

越来越多的开发者开始使用Go语言开发,这其中不乏有PHPPythonJava的,还有CC++Go的,技术功底可谓是鱼龙混杂、良莠不齐。无论是从小白入门还是直接上手做项目,如果要真正掌握一门编程语言,基本功早晚都要练的。

言归正传,在Go语言中有两个用来内存分配的内置函数:newmake。经历了很多项目,发现make的使用频率要远高于new,实际开发中make几乎是无可代替,之所以new的使用频率没那么高,是因为它有几种可以代替的编写方式。虽然都用于内存分配,但它们还是有一些区别,所以应用场景也各不相同。

GoLang 04月30日 1052

Ollama 让开源大语言模型触手可及

前有 ChatGPT 的横空出世,现有 DeepSeek 的后生可畏。

在人工智能(AI)飞速发展的今天,大语言模型(LLMs)百家争鸣、群英荟萃,AI已经成为人们茶余饭后必备的话题,更是人们工作、学习中必备的工具。

大语言模型(LLM)是一种利用大量数据训练的深度学习模型,旨在理解和生成人类语言。

PHP 02月24日 8888

Java 和 Go 中接口实现的区别

在面向对象编程中,接口是一个重要概念,它是一种契约,它定义了对象应该具备的方法。一个接口可以有多重实现,它的所有实现都必须满足接口所有约定的方法。并不是所有编程语言都有接口,例如在CPythonRuby中是没有内置的接口机制,但在大多数编程语言中都有接口的概念,一般用interface来标记。

JavaGo都是有内置的接口的机制,但在接口实现上却不尽相同。这些区别主要是接口定义、接口实现、约束机制和应用场景等方面,下面就这些不同进行逐一比较。

GoLang 02月04日 2034

如何在 Go 语言中接收和处理系统信号?

这里我们探讨的信号不是手机信号,也不是Wifi、蓝牙等信号。信号是 Linux、Unix以及其他 POSIX 兼容的操作系统中进程间通讯的一种机制,用于告知进程一个事件已经发生。

更准确的来说,这里所说的信号是在 Linux 系统中通过kill及其相关命令向指定进程发送的控制信号。在 Go 应用开发中,正确处理这些信号非常有必要。

在 Linux 操作系统中系统信号很多类型,这里简要列一些常用的系统信号:

| 信号 | 触发方式 | 用途 |

GoLang 01月19日 1046

Go 并发编程中的非阻塞锁:TryLock()

在使用 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 2024年12月26日 6686

Go 多模块工作区模式的最佳实践

在使用 Golang 做编程的学习和工作中,经常会将一个项目拆分成多个模块,模块之间保持着一定层级的依赖关系。往往修改完上游模块后,必须发布以后,下游模块更新后才能使用修改后的上游模块,如果在下游模块使用时发现问题需要再次修改上游模块,然后再发布,下游模块再更新,如此往复,费时费力,大大降低开发和调试效率。

工作区(workspaces) 模式是 Go1.18 中引入的新功能,让多个模块并行开发和调试。无需在 go.mod 中使用 replace 来本地使用开发上游模块。

在没有工作区之前,假设有两个模块mod1mod2mod1依赖mod2,如果mod2中做了修改,mod1要想使用mod2修改后的功能,有两种方式:

GoLang 2024年11月24日 2096

排行

解决方案

网站建设

专业企业官网建设,塑造企业形象,传递企业价值

系统开发

系统软件开发,用心思考,用心设计,用心体验

技术支撑

打破技术瓶颈,让不堪重负的项目起死回生

业务中台

构建全渠道一体化运营能力,实现全链路数字化

文案策划

文案撰写、营销策划,专注品牌全案

新媒体运营

一站式解决企业互联网营销痛点和难题

以技术的力量,改变互联网

联系我们
鄂ICP备19028750号-1 @copyright 2024 tech1024.com