变量
var 用于变量声明 声明变量,变量默认是该类型的0值 var a *int,给a赋值会panic,因为a的默认值是null,没有内存空间 new 为变量开辟内存空间 返回指针类型 可用于所有类型 make 为变量开辟内存空间,也能同时初始化 返回的是引用类型本身 只能用于slice,map,channel 传值or传指针 ...
var 用于变量声明 声明变量,变量默认是该类型的0值 var a *int,给a赋值会panic,因为a的默认值是null,没有内存空间 new 为变量开辟内存空间 返回指针类型 可用于所有类型 make 为变量开辟内存空间,也能同时初始化 返回的是引用类型本身 只能用于slice,map,channel 传值or传指针 ...
slice and array 相同点 len()获取长度,通过下表获取 分配一块连续的内存空间 array 值类型 var,:= 创建, 不可用make(运行时)、append、copy 创建后长度、容量不可改变 sl...
Go 的 select 用于同时监听多个 channel 操作,底层由 runtime 的 selectgo 函数实现。 执行时 runtime 会先随机打乱 case 顺序,然后遍历所有 case,检查对应 channel 是否 ready。如果有多个 ready,会随机选择一个执行; 如果都没有 ready 且存在 default,则执行 default; 如果没有 default...
context包 在goroutine中传递上下文信息、信号控制、公共参数等 context数据结构 type Context interface { Deadline() (deadline time.Time, ok bool) // 获取当前context的截止时间 Done() <-chan struct{} ...
go简介 静态类型 运行是runtime 基础题 https://learnku.com/articles/35063 规范 相似的变量放在一起声明 import包顺序,标准库、第三方库 包名全部小写 map、slice初始化 枚举从1开始 可以指定slice的容量 变量类型 值类型:array、int、struct 引...
原理 channel 是 Go 中实现 goroutine 之间通信和同步 的核心机制。 底层数据结构是 hchan,主要由环形队列 + 锁 + 发送/接收队列 + 调度器组成。 type hchan struct { qcount uint // 队列中剩余元素数量 dataqsiz uint // 循环队列的长度(channel的大小) buf ...
操作系统基础 COW(写时复制) Linux系统中,fork 子进程时,并不会立即把父进程所有内存页复制一份。而是在父进程/子进程对内存页修改时才进行复制。 参考Linux 写时复制机制原理 CAS(对比和交换) CUP 对比寄存器中值是否等于内存中的值,如果相等,则写入新值 彻底弄懂CAS(比较并交换) 存在问题 ABA问题;解决:采用版本号 自旋时间过...
sync.Pool - 临时对象池 概述 是一个临时对象缓存池,核心目的是减少对象频繁创建和释放带来的 GC 压力。 原理 1、每个 P 持有一个私有池(private),还有一个共享池(shared) type ProcessorPool struct { private any // 私有对象(无锁) shared poolChain // 共享链表(可被其他...
sync.Once - 函数只执行一下 demo package main import ( "fmt" "sync" ) func main() { var once sync.Once onceBody := func() { fmt.Println("Only once") } done := make(chan ...
sync.Mutex Go 的 sync.Mutex 底层主要由 state + semaphore 两个字段组成。 type Mutex struct { state int32 // 状态 sema uint32 // 信号量 } 加锁时首先通过 CAS(Compare and Swap,比较并交换) 尝试抢锁,如果失败会进行 短暂自旋,自旋仍失败则通过 信号量机...