摘要:在Go语言中,当指定文件权限时,使用前缀 0o 来明确表示八进制数是一种推荐的做法。 这是因为在Go语言中,八进制字面量必须以 0o 或 0O 开头,后跟八进制数字(0-7)。 这种语法是从 Go 1.8 开始引入的,目的是为了减少由于 八进制 字面量与零开头的 十进制数 之间的混淆。 在更早的 G
阅读全文
摘要:对一个无缓冲通道(chan)进行 range 操作意味着想要迭代并消费通道中的所有值。 但是,由于无缓冲通道的特性,这种操作具有特定的行为和潜在的副作用,主要体现在以下几点: 阻塞行为: 当你开始对无缓冲通道进行 range 操作时,每次循环迭代都会尝试从通道接收一个值。 如果通道中有值可用,ran
阅读全文
摘要:cgo 是 Go 语言中的一个工具,用于在 Go 中调用 C 代码或让 C 代码调用 Go 代码。 它通过编译时的预处理器和运行时的动态链接器来实现这一功能。 下面列出了 cgo 的一些主要优点和缺点: 优点 1.兼容现有 C 库: cgo 允许 Go 程序直接调用 C 语言编写的库,这极大地扩展了
阅读全文
摘要://go:build 是 Go 语言(golang)中的一种构建标签(build tag),用于控制源代码文件在特定条件下是否被编译。 这个注释标记允许你在同一个包内编写针对不同平台、操作系统或编译条件的代码。当 go build 或 go test 等命令执行时,它们会检查这些标签来决定哪些文件应
阅读全文
摘要:区分公有地址(Public IP Addresses)和私有地址(Private IP Addresses)主要依据它们的分配、使用范围以及是否能在全球互联网上直接路由。 以下是一些关键区别: 分配和管理: 公有地址:由互联网地址分配机构(Internet Assigned Numbers Auth
阅读全文
摘要:golang embed 包的主要功能是在运行时提供对嵌入到 Go 程序中的文件的访问。 使用 embed 包,Go源文件可以通过使用 //go:embed 指令来将文件的内容初始化为字符串、字节切片或 FS 类型。 这样可以在运行时直接访问这些文件的内容。 以下是使用 embed 包的三个示例:
阅读全文
摘要:func whoCalledMe() { // 获取调用堆栈信息 _, fileName, lineNo, ok := runtime.Caller(2) if !ok { fmt.Println("Failed to get caller information") return } fmt.Pr
阅读全文
摘要:Go代码的接口守卫(interface guards)技术,通常用于库的开发,以确保类型符合预期的接口。 下面示例的 Interface guards 确保 App 类型实现了caddy.App、caddy.Provisioner 和 caddy.Validator 接口。 具体来说,它通过将 (*
阅读全文
摘要:Go语言中的 net 包提供了一个可移植的网络输入输出接口,涵盖了 TCP/IP、UDP、域名解析以及 Unix 域套接字等功能。 该包提供了访问底层网络原语的能力,但大多数客户端仅需使用基本接口,这包括 Dial、Listen 和 Accept 函数以及相关的 Conn 和 Listener 接口
阅读全文
摘要:golang 所有关键字的列表及释义归类,截至1.18版本。 [控制结构] if : 条件语句,基于布尔表达式的值决定是否执行特定的代码块。 else、 else if : 用在 if 语句之后,当条件表达式为假时执行的代码块。 switch : 多路选择语句,根据不同的情况执行不同的代码块。 ca
阅读全文
摘要:select {} 与 for {} 在 Go 语言中都是循环结构,但它们的行为和用途有所不同: select {}: 是一个无限阻塞的 select 语句,没有指定任何 case。 主要用于等待通道操作或其他事件,在没有明确的通信或信号需求时保持运行状态。 当程序需要在没有明确结束条件的情况下保持
阅读全文
摘要:Go语言中的 reflect 包提供了运行时反射机制,允许程序在运行时检查和操作任意对象的数据类型和值。 以下是 reflect 包的一些典型使用场景: 1. 动态类型判断与转换:当需要处理多种类型的变量且具体类型直到运行时才能确定时,可以使用反射来检查变量的实际类型,并在可能的情况下进行类型转换。
阅读全文
摘要:[]byte(message) 将字符串 message 转换为一个字节切片( []byte )。 在Go语言中,字符串是不可变的,而字节切片可以被修改。 这种转换常用于处理字符串的字节级操作,如编码、解码或写入IO流。 字节级操作 和 字符串操作 在编程中有本质的不同,主要体现在以下几个方面: 1
阅读全文
摘要:使用sync.Map与普通的Go map主要有以下几点区别: 1. 并发安全性 普通map: 在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。 sync.Map: 是并发安全的。它内部实现了必要的同步机制,允许
阅读全文
摘要:sync.Once 的 Do 方法和 OnceFunc/OnceValue/OnceValues 函数的主要区别在于使用场景和灵活性: 1、直接使用Once.Do(f): 更基础、低级的 API。你需要显式声明一个 sync.Once 变量,然后在其上调用 Do(f)方法来执行函数f。 仅保证函数f
阅读全文
摘要:尽管 Go 语言在很多方面设计得相当精巧,但仍有一些特性或限制可能让部分开发者觉得 “别扭” 或需要时间适应。 下面是一些常见的讨论点: 1. 错误处理: Go 语言没有异常机制,而是通过返回错误值的方式来处理错误。 这意味着在很多函数调用后都需要检查错误,可能会导致代码中出现大量的错误检查逻辑,有
阅读全文
摘要:Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑。 泛型通过参数化类型(type parameters)来实现,使得函数、方法、接口和结构体可以与多种类型一起工作。 下面详细介绍Go语言中泛型的基本
阅读全文
摘要:type Once struct { done atomic.Uint32 m Mutex } sync.Once 是 Go 语言标准库 sync 包中的一个类型,用于确保某个操作(函数)只被执行一次。 这对于初始化操作非常有用,比如数据库连接的建立、日志文件的打开等,这些操作通常只需要在程序启动时
阅读全文
摘要:问题: golang select 结构,假如底下有三个case,分别从 chan1, chan2, chan3 读取内容,chan1, chan2, chan3都是非阻塞的,那么是会先进入第一个 case,其它case还会再进入吗 ? 在 Go 语言中,select 语句用于监控多个通道的操作,并
阅读全文
摘要:在 Go 语言中,struct 和 interface 都可以关联方法,但它们的方式不同: 1. struct 添加方法: 结构体(struct)本身不直接包含方法,但可以通过定义一个指向该结构体类型的指针作为接收者的函数来为结构体“添加”方法。 type MyStruct struct { //
阅读全文