1、golang基础
go出现panic的场景
-
数组/切片越界
-
访问一个 nil 结构体指针
-
过早关闭 HTTP 响应体
-
除以 0
-
未初始化 map
-
类型断言不匹配
Go 多返回值怎么实现的?
-
Go 的多返回值是通过 栈 来实现的
-
函数的多返回值会被依次压入调用栈中。
闭包
func main() {
f := test()
fmt.Println(f(1))//11
fmt.Println(f(2))//13
}
func test() func(x int) int {
var n int = 10
return func(x int)int {
n = n + x
return n
}
}
go版本 1.18 1.19 1.20 1.21 1.22 1.23 1.24区别
1.18: 新增泛型支持(核心特性)
1.19:泛类优化
1.20:// 支持将切片转换为数组指针 s := []int{1,2,3} p := (*[3]int)(s)
1.21:
| 场景 |
用 slice(内建) |
用 slices(库) |
|---|---|---|
| 定义切片 |
[]int{1, 2, 3} |
不适用 |
| 添加元素 |
append(slice, elem) |
不适用(还是用 append) |
| 排序 |
sort.Ints(slice) |
✅ slices.Sort(slice)(推荐) |
| 查找是否包含元素 |
手写 for 循环遍历 |
✅ slices.Contains(slice, val) |
| 比较两个切片是否相等 |
手写 for 比较每个元素 |
✅ slices.Equal(slice1, slice2) |
1.22: // 新增范围整数语法
for i := range 5 { fmt.Println(i) }
1.23-1.24
未引入重大语法变更
gin中的context和go中context区别
- context.Context 更通用,适合并发控制、超时、取消等场景。
- *gin.Context 是 Web 层专用,功能更丰富,包含 HTTP 相关操作。
反射
1、反射核心参数
• reflect.Type:表示一个变量的类型。返回[]int
• reflect.Value:表示一个变量的值。
• reflect.Kind:表示具体的类型分类,更深slice。
2、怎么获取标签
type User struct {
ID int `json:"id" db:"user_id"`
Name string `json:"name" db:"username"`
}
func main() {
t := reflect.TypeOf(User{}) // 获取类型信息
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Printf("字段名: %s\n", field.Name)
fmt.Printf(" json 标签: %s\n", field.Tag.Get("json"))
fmt.Printf(" db 标签: %s\n", field.Tag.Get("db"))
}
}
defer
defer关闭资源时,程序中断会被会被关闭吗?
-
defer在以下情况会执行:-
正常退出。
-
panic崩溃(当前函数的defer)。 -
捕获中断信号(如
Ctrl+C)。
-
-
defer在以下情况不会执行:-
os.Exit退出。 -
强制终止(如
kill -9)。
-
切片
1、重要参数
- copy:相当于覆盖
2、切片是否线程安全,为什么不安全,如何保证安全
- 不安全
-
一个 Goroutine 在读 Slice 时,另一个 Goroutine 在修改 Slice,可能会导致读取到脏数据。
-
当 Slice 容量不足时,
append会触发扩容,创建新的底层数组并复制数据。多个 Goroutine 同时append时,可能会导致数据丢失或错误。
3、扩容
1.8以后 低于256 是2倍,之后1.25+196
map
1、map 使用注意的点
- key必须是可比较的类型。整数、浮点数、字符串、布尔值和某些复合类型(如指针、数组(切片不行)、结构体)
- map有序,orderedmap(有序的是按照ascc从小到大排序)。
- 要先初始化,否则panic
2、为什么不安全
-
底层实现:Go 的 Map 是一个哈希表,包含多个桶,每个桶存储键值对。并发读写时,多个 Goroutine 可能同时修改桶或触发扩容,导致数据竞争。
使用读写锁
读很多携程可以获取锁去读,写只能有一个协程获取锁
package main
import (
"fmt"
"sync"
)
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func NewSafeMap() *SafeMap {
return &


8149

被折叠的 条评论
为什么被折叠?



