在 Go 语言中要初始化一个数组可有很多种方式,可以直接指定长度不指定元素var arr [5]int
,也可以显示初始化数组指定长度并赋值arr := [5]int{1, 2, 3, 4, 5}
,还可以按索引指定部分索引的值arr := [5]int{0: 10, 3: 40}
。
但是刚刚刷到一道面试题,题目是这样的:
在 Go 语言中要初始化一个数组可有很多种方式,可以直接指定长度不指定元素var arr [5]int
,也可以显示初始化数组指定长度并赋值arr := [5]int{1, 2, 3, 4, 5}
,还可以按索引指定部分索引的值arr := [5]int{0: 10, 3: 40}
。
但是刚刚刷到一道面试题,题目是这样的:
在 Go 项目中使用go mod
作为依赖管理工具,go.mod
文件是其核心配置文件。
一般情况下,go.mod
的配置项主要有:module
go
require
,大概结构如下:
module github.com/project/demo
go 1.24.0
require (
github.com/gin-gonic/gin v1.10.1
gorm.io/driver/sqlite v1.6.0
gorm.io/gorm v1.30.1
)
require (
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
... // 省略其他依赖
)
上面这个go.mod
是通过go mod tidy
整理后的,可以看出有两段require
配置,require
中列出了该项目所有的依赖项及其版本。
提起 Go 语言中的rune
类型,相信大家对它并不陌生。虽然它并不常用,但在我的印象里,用得最多的就是用它来处理中文字符串截取。
没错,多语言的字符串处理就是rune
的强项。
今天网上刷到一个网友的提问:在 Go 语言中两个 interface{} 可以比较吗?我想了一下,在我的项目中,几乎很少去直接比较两个interface{}
类型的变量,但真要比较的话,答案是肯定的,两个interface{}
肯定可以比较,但是多少得注意一下细节。随后,我就在网上查阅了相关资料,在这里和大家详细分享一下。
interface{}
不仅仅用来表示接口,它是一个动态类型,可以用来表示任意类型,也有一个别名any
。这里所说的比较是指用==
或!=
比较。
很多人都说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
}
可以看出,字段和类型完全相同的两个结构体,所占内存并不相同。这两个结构体仅仅只是字段的顺序不同,但所占内存却差别这么大呢?
在当今复杂的Web应用中,精细化的权限管理是保障系统安全的关键环节。PHP-Casbin 作为Casbin生态的PHP实现,凭借其灵活的模型支持和强大的扩展能力,已成为PHP开发者实现访问控制的首选工具。
PHP-Casbin 基于PERM(Policy/Effect/Request/Matcher)模型,抽象出通用的访问控制框架。
有一天,突然在项目中看到有个clear
的函数,还以为是本地定义的函数,但在本地却没有找到相关定义。鼠标放上那么一点,才发现是Go
语言中内置的函数,恕我孤陋寡闻了。
于是,就在网上各种搜索准备一探究竟,才知道clear
函数是Go1.21
版本中引入的内置函数,一起被引入的还有max
和min
函数。
越来越多的开发者开始使用Go
语言开发,这其中不乏有PHP
、Python
、Java
的,还有C
和C++
转Go
的,技术功底可谓是鱼龙混杂、良莠不齐。无论是从小白入门还是直接上手做项目,如果要真正掌握一门编程语言,基本功
早晚都要练的。
言归正传,在Go
语言中有两个用来内存分配的内置函数:new
和make
。经历了很多项目,发现make
的使用频率要远高于new
,实际开发中make
几乎是无可代替,之所以new
的使用频率没那么高,是因为它有几种可以代替的编写方式。虽然都用于内存分配,但它们还是有一些区别,所以应用场景也各不相同。
new
就是纯用来内存分配的,它返回的是被分配类型的指针,并初始化为该类型的零值
。
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
专业企业官网建设,塑造企业形象,传递企业价值
系统软件开发,用心思考,用心设计,用心体验
打破技术瓶颈,让不堪重负的项目起死回生
构建全渠道一体化运营能力,实现全链路数字化
文案撰写、营销策划,专注品牌全案
一站式解决企业互联网营销痛点和难题
以技术的力量,改变互联网
联系我们