获得徽章 0
- #青训营 x 字节后端训练营# Viper是一个用于配置管理的Go语言库,它提供了一种简单而灵活的方式来处理应用程序的配置需求。使用Viper,开发人员可以轻松地读取、解析和管理配置文件,以及从不同的配置源(如环境变量、命令行参数等)获取配置值。
Viper的主要优势在于其灵活性。它支持多种配置文件格式,包括JSON、YAML、TOML等,开发人员可以根据项目需求选择合适的格式。此外,Viper还支持配置的分层机制,可以定义默认配置值,并允许覆盖和扩展这些值,使得配置管理更加方便和可扩展。
另一个重要特性是Viper支持热加载配置,这意味着应用程序可以在运行时动态修改配置,而无需重启。这对于需要动态调整配置的场景非常有用,例如在服务端部署时,可以通过修改配置文件或环境变量来实时调整应用程序的行为。
Viper还提供了强大的变量替换和类型转换功能。开发人员可以在配置文件中使用变量,然后在读取配置时进行替换,从而实现配置的复用和灵活性。此外,Viper能够自动将配置值转换为相应的Go语言类型,简化了开发人员的操作。展开评论点赞 - #青训营 x 字节后端训练营# Golang 是一种支持高并发的编程语言,具有轻量级的线程(Goroutine)和高效的通信机制(Channel),使得并发编程变得简单和高效。
协程是 Golang 并发编程的核心,它可以看作是一种轻量级的线程,可以在一个进程内并发执行,每个协程只占用极小的资源。协程的调度不需要切换到内核态,所以具有非常高的执行效率和吞吐量。在 Golang 中,创建一个协程非常简单,只需要在函数或方法前添加 go 关键字即可,比如:go func() {}()。
管道是协程之间通信的一种重要方式,它提供了一个同步和异步传输数据的机制。管道可以看作是一条数据传输通道,它由两个端点组成,一个是发送端,一个是接收端。数据只能从发送端流向接收端,而且是顺序传输的,保证了数据的同步性。在 Golang 中,使用 make() 函数创建管道,并使用 <- 运算符发送和接收数据,比如:ch := make(chan int); ch <- 1。
select 语句是 Golang 管道通信机制的重要组成部分,它可以同时监听多个管道,一旦某个管道准备好了数据,就会执行相应的语句块。select 语句可以用来处理多个并发任务的返回值,也可以用来实现超时控制,避免出现死锁等问题。展开赞过评论1 - #青训营 x 字节后端训练营#
一. 零值、空值、空切片与空结构
1.零值
- 值类型 → [Bool: false] [Number: 0] [String: “”] ,初始值取决于元素或字段
- 引用类型 → 均nil ,包括pointer指针、function函数、interface接口、slice切片、channel管道、map映射
- 考虑安全性,通常需要为变量赋予一个默认值,例如
```go
package main
import "sync"
type Value struct {
mu sync.Mutex //互斥锁类型,保护共享资源的并发访问
val int
}
//递增操作的方法
func (v *Value)Incr(){
defer v.mu.Unlock() //解锁
v.mu.Lock() //上互斥锁,确保只有一个goroutine能进入临界区
v.val++
}
func main() {
var i Value //默认0值
i.Incr()
}
// 主要实现互斥锁(Mutex)实现并发安全的操作
// 使用了互斥锁,保证了对共享资源的安全访问,避免了并发访问导致的数据竞争和不一致性。
```
⚠️:`:=`是**声明并且初始化变量,已经被分配了内存地址,故不是零值nil**
```go
var s1 []string
s2 := []string{} // 或者等同于 var s2 = []string{}
//其中,s1、s2输出都为 -> [],但一个是零值nil,一个是空字符串
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // false
```
2.nil
- 主要是用来表示引用类型的零值,是Golang的标识符
- nil ≠ nil 问题原因 → interface
- inteface有两个属性**Type**and**Value**
- 可以有两种方式解决,可以分别将类型和值分别和nil比较或者使用反射包reflect展开赞过评论1