Golang
文章平均质量分 72
程序员红豆
这个作者很懒,什么都没留下…
展开
-
Go语言新手容易犯下的错误
Gopher新手常犯的语法错误原创 2022-07-17 23:19:46 · 318 阅读 · 0 评论 -
GoWEB应用性能优化方法与套路
在了解性能优化之前,我们先来了解一下时间单位的换算从上图我们可以大概知道高速缓存、主存、SSD硬盘、还有硬盘的读写速度时间参考值和量级L1 cache reference是 1nsL2 cache reference是 4nsMain memory reference是100nsSSD random readreference是16000ns ≈ 16≈ 2 ms从上面五个数据来看,我们就能大概知道各种储设备的读写速度以及它们之间的量级之差首先,我们优化怎么先从大头开始优化,这样我们才能获得最大收益本篇文原创 2022-06-30 14:14:24 · 364 阅读 · 0 评论 -
Go并发编程之常见并发bug
注意:下述所有图片中 - 号是BUG代码,+号是修复BUG的代码goroutine1 ch发送者被阻塞住,无法释放锁goroutine2 loop获取锁失败 context.WithCancel内部启动goroutine,在ctx被覆盖后goroutin永久泄露使用WaitGroup一定要遵守的原则就是,等所有的Add方法调用之后再调用Wait,否则就可能导致panic或者不期望的结果 关闭已经关闭的channel会导致panic,因此在并发编程中要处理好channel的关闭这个bug无法被recover原创 2022-06-29 23:12:35 · 684 阅读 · 0 评论 -
Go并发编程之内置数据结构
声明对象池,只需要实现 New 函数即可。对象池中没有对象时,将会调用 New 函数创建。 用于从对象池中获取对象,因为返回值是 ,因此需要类型转换。 则是在对象使用完毕后,返回对象池。 Go语言中sync库提供了两种锁互斥锁(sync.Mutex)和读写锁(sync.RWMutex)互斥锁,互斥即不可同时运行。即使用了互斥锁的两个代码片段互相排斥,只有其中一个代码片段执行完成后,另一个才能执行。Go 标准库中提供了 sync.Mutex 互斥锁类型及其两个方法:读写锁,分为读锁和原创 2022-06-29 21:54:47 · 371 阅读 · 0 评论 -
Go语言之channel实现原理
在写代码的时候,我们很多时候都会用到channel,但是channel是如何实现的呢?基于上一篇文章Go语法实现分析之chan、go func、类型转换_程序员红豆的博客-CSDN博客声明、初始化代码,我们都懂,但是它背后是怎么实现的呢?https://blog.csdn.net/qq_37186127/article/details/125521611我们来分析分析channel的实现我们先看chan.go的hchan结构qcount:channel当前的数据总数dataqsiz:channel的大原创 2022-06-29 17:08:09 · 730 阅读 · 0 评论 -
Go语法实现分析之chan、go func、类型转换
声明、初始化代码,我们都懂,但是它背后是怎么实现的呢?原创 2022-06-29 15:36:31 · 518 阅读 · 0 评论 -
Go语言语法分析之我想打同事的脸--编译
不知道你有没有遇到这种情况,同事和你争执,非要说左边的代码要比右边的快,因为左边的少写了一行代码,这时你心生不忿但又无力反驳,只好忍气吞声那这边文章我们就来打他的脸我们先来看一下我们日常写代码的日常过程我们写完的代码最终会变成一个 hello 的二进制可执行文件 只要我们编译的时候得到的结果是一样的,我们就可以堵住同事的嘴我们分别对上述的代码进行编译left.go right.go 我们对比两个编译结果可以发现,其实它们是没有区别的,因此我们就可以知道它们的运行效率是一样的本文完~.原创 2022-06-29 14:34:30 · 115 阅读 · 0 评论 -
Go是如何处理goroutine阻塞的?
当我们在go func{}下有如何代码的时候,Go是如何处理阻塞的?注:阻塞情况还有其它情况比如 加锁,网络连接读/写,select 我们需要知道在Go中代码的执行是需要线程(M)绑定 P 才能在CPU上执行如果不知道什么是GMP,可以先阅读【GMP】当我写下go func的时候,到底发生了什么?_程序员红豆的博客-CSDN博客我们先理解什么是G、M、PG∶goroutine,一个计算任务。由需要执行的代码和其上下文组成,上下文包括∶当前代码位置,栈顶、栈底地址,状态等。M∶ machine,系统线程,执行原创 2022-06-29 14:00:27 · 1838 阅读 · 0 评论 -
【GMP】写下go func的时候,到底发生了什么?
我们先理解什么是G、M、PG∶goroutine,一个计算任务。由需要执行的代码和其上下文组成,上下文包括∶当前代码位置,栈顶、栈底地址,状态等。M∶ machine,系统线程,执行实体,想要在CPU上执行代码,必须有线程,与C语言中的线程相同,通过系统调用 clone 来创建。P:processor,虚拟处理器,M必须获得P才能执行代码,否则必须陷入休眠(后台监控线程除外),你也可以将其理解为一种 token,有这个 token,才有在物理 CPU核心上执行的权力。Go的调度流程本质上是一个生产-消原创 2022-06-29 12:19:50 · 751 阅读 · 0 评论 -
Go程序是如何运行起来的?
我们都知道我们执行下面命令会生成一个二进制可执行文件 但是当我们执行hello时,Go程序是如何执行的呢? 接下来的工具工具都打包在Docker images里了,大家可以自行实践我们先了解一下Go程序的编译 hello.go 的过程 上面三幅图第一幅是我们程序的代码第二幅是执行程序编译第三幅是多出了一个可执行的二进制 hello 文件 通过entry point 找到Go程序的执行入口,使用readelf 以上述为例子,执行了readelf -h ./hello命令 我们可以看到ELF Header原创 2022-06-29 11:21:32 · 2220 阅读 · 0 评论 -
【Go语言陷阱】遍历map无法顺序输出?
场景我们来看下面这段代码,你认为它的输出结果会是什么?func main() { m := map[int]string{ 1: "one", 2: "two", 3: "three", 4: "four"} for k, v := range m { fmt.Println(k, v) }}预期的输出结果1 one2 two3 three4 four我们通常认为遍历都是有顺序的输出的但在Go语言中,..原创 2022-01-18 13:45:17 · 452 阅读 · 0 评论 -
【Go语言陷阱】结构体未导出的字段无法被编解码
我们来看一段代码你觉得14、17、22行的输出分别是什么?import ( "encoding/json" "fmt")type Data struct { One int two string three int}func main() { in := Data{1, "two", 3} fmt.Printf("%#v\n", in) encoded, _ := json.Marshal(in) fmt.Println(string(e原创 2022-01-04 21:36:27 · 511 阅读 · 0 评论 -
【Go语言陷阱】你可能想不到的字符串长度
在Go语言中,我们要统计字符串中字符的个数,我们肯定会想到用utf8.RuneCountInString()但是,这里我们可能会碰到一个陷阱我们来看一段代码func main() { data := "我"println(utf8.RuneCountInString(data)) data = "é"println(utf8.RuneCountInString(data))}在第3行代码中,输出结果是1,我相信大家都能想得到在第6行代码中,你是否会觉得它会输出是...原创 2021-12-24 15:42:36 · 261 阅读 · 0 评论 -
Go的panic和recover与错误处理
panic停止当前函数执行一直向上返回,执行每一层的defer如果没有遇见recover,程序退出func writeFile(filename string) { file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { if pathError, ...原创 2019-05-04 10:57:01 · 252 阅读 · 0 评论 -
Go的defer
defer相当于一个栈防止中间returndefer确保在调用函数结束时发生参数在defer语句时计算 for i := 0; i < 100; i++ { defer fmt.Println(i) if i == 30 { // Uncomment panic to see // how it works with defer // panic("prin...原创 2019-05-04 10:37:02 · 225 阅读 · 0 评论 -
GO协程(goroutine)的使用
协程是什么?协程是轻量级线程 非抢占式多任务处理,由协程主动交出控制权非抢占式:计算机资源是由CPU控制调度,程序的执行由CPU控制,一个执行中的程序时间到了或者进行了I/O等阻塞操作系统会挂起该程序等待下一个时间分片再执行 编译器/解释器/虚拟机层面的多任务—操作系统层面只有线程它还没有协程 一个线程可有一个goroutine或者多个goroutine,这有GO的调度器决定。同时要记...原创 2019-05-04 01:07:41 · 903 阅读 · 0 评论