golang学习~~

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 &
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值