![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang复习
文章平均质量分 67
~庞贝
Go后端开发
展开
-
简述 Go 语言GC(垃圾回收)的工作原理
简述 Go 语言GC(垃圾回收)的工作原理最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术,提高了效率。标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段:标记阶段 — 从根对象出发查找并标记堆中所有存活的对象;清除阶段 — 遍历堆中的全部对象,回收未被标记的垃圾对象并将回收的内存加入空闲链表。标记清除算法的一大问题是在标记原创 2022-05-22 10:25:09 · 562 阅读 · 0 评论 -
Go Context 并发编程
目录Go Context 并发编程1 为什么需要 Context2.context.WithCancel2.1 控制单个协程2.2 控制多个协程3 context.WithValue4 context.WithTimeout5 context.WithDeadlineGo Context 并发编程1 为什么需要 ContextWaitGroup 和信道(channel)是常见的 2 种并发控制的方式。如果并发启动了多个子协程,需要等待所有的子协程完成任务,WaitGroup 非常适合于这类场景,例如原创 2022-05-22 10:01:02 · 117 阅读 · 0 评论 -
Context携带数据是线程安全的吗?
目录Context携带数据是线程安全的吗?`context`携带`value`是线程安全的吗?为什么线程安全?Context携带数据是线程安全的吗?context携带value是线程安全的吗?先说答案,context本身就是线程安全的,所以context携带value也是线程安全的,写个简单例子验证一下:func main() { ctx := context.WithValue(context.Background(), "asong", "test01") go func() { fo原创 2022-05-21 22:48:56 · 163 阅读 · 0 评论 -
Go语言切片原生支持并发吗?
目录Go语言切片原生支持并发吗?实践检验真理slice支持并发吗?总结Go语言切片原生支持并发吗?实践检验真理实践是检验真理的唯一标准,所以当我们遇到一个不确定的问题,直接写demo来验证,因为切片的特点,我们可以分多种情况来验证:1.不指定索引,动态扩容并发向切片添加数据func concurrentAppendSliceNotForceIndex() { sl := make([]int, 0) wg := sync.WaitGroup{} for index := 0; index &原创 2022-05-21 21:31:39 · 74 阅读 · 0 评论 -
神奇的init函数
目录神奇的init函数`init`函数的特性`init`函数的执行顺序`init`函数的使用场景神奇的init函数init函数的特性先简单介绍一下init函数的基本特性:init函数先于main函数自动执行每个包中可以有多个init函数,每个包中的源文件中也可以有多个init函数init函数没有输入参数、返回值,也未声明,所以无法引用不同包的init函数按照包导入的依赖关系决定执行顺序无论包被导入多少次,init函数只会被调用一次,也就是只执行一次init函数的执行顺序下图来源于网络原创 2022-05-21 11:32:47 · 318 阅读 · 0 评论 -
Go语言中new和make你使用哪个来分配内存?
目录Go语言中new和make你使用哪个来分配内存?分配内存之`new`初始化内置结构之`make``new`和`make`区别总结`make`函数底层实现`new`函数底层实现总结Go语言中new和make你使用哪个来分配内存?分配内存之new官方文档定义:// The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a p原创 2022-05-21 11:10:58 · 262 阅读 · 0 评论 -
Go语言中string和[]byte的转换原理
目录Go语言中string和[]byte的转换原理byte类型`[]byte`类型string类型string和[]byte有什么区别string和[]byte标准转换string和[]byte强转换两种转换如何取舍总结Go语言中string和[]byte的转换原理byte类型我们看一下官方对byte的定义:// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is// used, by conventio原创 2022-05-21 10:29:34 · 3218 阅读 · 0 评论 -
Golang两个nil比较
目录Golang两个nil比较Go中`nil`的定义深入理解`nil``nil`根本不是关键字`nil`的默认类型`nil`的比较`nil`在不同类型中使用需要注意的问题`interface`与`nil`比较要注意的一个点一个`nil`的`map`读写数据是否会发生`panic`关闭`nil`的`channel`会引发`panic`一个为`nil`的`slice`使用注意事项方法接收者为`nil`时是否会引发`panic`空指针是一个没有任何值的指针Golang两个nil比较前几天在一个交流群里看到了一原创 2022-05-20 20:50:25 · 368 阅读 · 0 评论 -
Go语言中的零值
目录Go语言中的零值零值有什么用通过零值来提供默认值开箱即用零值并不是万能总结Go语言中的零值以下内容来自官方blog:https://golang.org/ref/spec#The_zero_value当通过声明或 new 调用为变量分配存储空间时,或通过复合文字或 make 调用创建新值时,且未提供显式初始化,则给出变量或值一个默认值。此类变量或值的每个元素都为其类型设置为零值:布尔型为 false,数字类型为 0,字符串为 “",指针、函数、接口、切片、通道和映射为 nil。此初始化是递归完成的原创 2022-05-20 13:36:06 · 1217 阅读 · 0 评论 -
Go语言详解内存对齐
目录Go语言详解内存对齐前情概要何为内存对齐为何要有内存对齐对齐系数结构体的内存对齐规则举个例子成员变量顺序对内存对齐带来的影响空结构体字段对齐考虑内存对齐的设计Go语言详解内存对齐前情概要在了解内存对齐之前,先来明确几个关于操作系统的概念,更加方面我们对内存对齐的理解。内存管理:我们都知道内存是计算中重要的组成之一,内存是与CPU进行沟通的桥梁,用于暂存CPU中的运算数据、以及与硬盘等外部存储器交换的数据。早期,程序是直接运行在物理内存上的,直接操作物理内存,但是会存在一些问题,比如使用效率低、地原创 2022-05-20 13:35:10 · 1110 阅读 · 0 评论 -
Go语言中for-range使用踩坑指南
这里写目录标题Go语言中for-range使用踩坑指南1. 指针数据坑2. 迭代修改变量问题3. 是否会造成死循环你不知道的`range`用法`delete`addGo语言中for-range使用踩坑指南1. 指针数据坑range到底有什么坑呢,我们先来运行一个例子吧。package mainimport ( "fmt")type user struct { name string age uint64}func main() { u := []user{ {"ason原创 2022-05-19 16:43:34 · 1130 阅读 · 0 评论 -
通知子协程退出的三种方式
目录方式一:使用全局变量方式二:使用管道方法三:使用content方式一:使用全局变量package mainimport ( "fmt" "sync" "time")//定义全局变量var wg sync.WaitGroupvar exit boolfunc worker() { defer wg.Done() for !exit { fmt.Println("worker...") time.Sleep(time.Seco原创 2022-02-22 14:20:14 · 256 阅读 · 0 评论 -
Golang复习——第四天
第四天1.下面这段代码能否通过编译,不能的话原因是什么;如果能,输出什么。func main() { list := new([]int) list = append(list, 1) fmt.Println(list)}参考答案及解析:不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。可以使用 make() 初始化之后再用。同样的,map 和 channel 建议使用 make() 或字面量的方式初原创 2022-02-14 18:28:32 · 108 阅读 · 0 评论 -
Golang复习——第三天
第三天1.下面两段代码输出什么。// 1. func main() { s := make([]int, 5) s = append(s, 1, 2, 3) fmt.Println(s) }// 2. func main() { s := make([]int,0) s = append(s,1,2,3,4) fmt.Println(s)}两段代码分别输出: [0 0 0 0 0 1 2 3] [1 2 3 4]参原创 2022-02-13 15:01:31 · 153 阅读 · 0 评论 -
Golang复习——第二天
第二天下面这段代码输出什么,说明原因。func main() { slice := []int{0,1,2,3} m := make(map[int]*int) for key,val := range slice { m[key] = &val } for k,v := range m { fmt.Println(k,"->",*v) }}直接给答案: 0 -> 3原创 2022-02-12 19:30:11 · 189 阅读 · 0 评论 -
Golang复习——第一天
第一天下面这段代码输出的内容package main import ( "fmt" ) func main() { defer_call() }func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() panic("触发异常")原创 2022-02-11 16:03:38 · 341 阅读 · 0 评论