Go 基础

make 方法

  • make用于创建和初始化切片(slice)、映射(map)和通道(channel) 的内置函数。
1. 切片(Slice)
go 复制代码
// 语法:make([]T, length, capacity) 
// capacity(容量)可选,不写默认等于 length
slice1 := make([]int, 5)      // 长度5,容量5,初始值 [0,0,0,0,0]
slice2 := make([]string, 0, 10) // 长度0,容量10(预分配空间,追加时不频繁扩容)

何时用 :当你需要动态扩容或用 append 添加元素,但想预先指定长度或容量时。

2. 映射(Map)
go 复制代码
// 语法:make(map[KeyType]ValueType, hint) 
// hint(容量提示)可选,用于预估大小以提升性能
m1 := make(map[string]int)     // 空的 map,可直接读写
m2 := make(map[int]bool, 100) // 预估有100个键值对,减少扩容开销

注意 :直接用 var m map[string]int 得到的是 nil,读取时会返回零值(不报错),但写入会引发 panic ,所以必须用 make 或字面量 {} 初始化。

3. 通道(Channel)
go 复制代码
// 语法:make(chan T, bufferSize)
ch1 := make(chan int)      // 无缓冲通道(同步通信)
ch2 := make(chan bool, 5) // 有缓冲通道(容量5,异步通信)

何时用 :协程间通信时,用 make 创建通道实例。

接口和类型

  • 即便是业务开发,也应该面向接口编程
  • 结构体和结构体的字段都遵循大小写控制访问性的原则

接口

接口是一组行为的抽象

go 复制代码
type List interface {
   Add(index int, val any)
   Append(val any)
   Delete(index int)
}

结构体

new 可以理解为 Go 会为你的变量分配内存,并且把内存都置为0。

go 复制代码
// 初始化语法
type User struct {}

// 获取指针
- &User{}
- new(User)

注: Go 没有构造函数

方法接收器

一个方法可以定义在这个结构体上,也可以定义在这个结构体的指针上。

  • 结构体接收器内部修改字段,不会生效。因为方法调用本身是值传递的。
    • 如果是基本类型,结构体,那么就相当于复制了一份。
    • 如果是指针,那么就复制了一份指针(也就是地址),但是指向的结构体还是同一个。
    • 内置类型复制了一份,但是它们的内部数据结构,还是同一个。
  • 如果在结构体内部还要引用自身,那么只能使用指针。
go 复制代码
type User struct {
    Name string
    Age  int
}

// 结构体接收器
func (u User) ChangeName(name string) {
    u.Name = name
}

// 指针接收器
func (u *User) ChangeAge(age int) {
    u.Age = age
}

defer 实现机制

defer 的内部实现分成三种机制:
  • 堆上分配:是指整个 defer 直接分配到堆上,缺点就是要被 GC 管理。

  • 栈上分配:整个 defer 分配到了 goroutine 栈上,不需要被 GC 管理。比堆上分配性能提升了

30%。

  • 开放编码(Open Code):启用内联的优化,你直观理解就是相当于把你的 defer 内容放到了你的函数最后。启用条件:

    • 函数的 defer 数量少于或者等于 8 个;

    • 函数的 defer 关键字不能在循环中执行;

    • 函数的 return 语句与 defer 语句的乘积小于或者等于 15 个。

相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿10 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909611 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒12 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构13 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构13 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构14 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常15 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端