Go 语言学习
文章平均质量分 76
Gerald Kwok
低到尘埃里,才能开出花来。
展开
-
Golang 并发安全有序链表的实现原理
Golang 并发安全有序链表的实现原理前言平时使用 Golang 开发的小伙伴一定知道,Go 语言在进行高并发变成是极其容易的,因为 Go 语言自身就支持了多协程。但是 Go 语言的数据结构大多都不具备 scalable,无论是使用锁+hmap,还是使用并发安全的 sync.Map,在高并发场景下,程序都会随着协程数量的增加导致性能下降。所以编写支持高并发且具备 scalable 的数据结构就显得尤为重要。并发安全问题当多个 goroutine(协程) 同时访问相同的变量且具有写操作时,就会发生未原创 2021-08-13 20:22:47 · 728 阅读 · 0 评论 -
Go 基于 Redis + Lua 实现分布式限流器
Go 基于 Redis + Lua 实现分布式限流器限流算法在分布式系统设计中有广泛的应用,特别是在系统的处理能力有限的时候,通过一种有效的手段阻止限制范围外的请求继续对系统造成压力,避免系统被压垮,值得开发工程师们去思考。实际生活中,限流器算法通常作为限制用户行为的一种方式之一。比如最近我在某东抢 PS5,开始购买的一瞬间就没了,肯定是有些用户使用了脚本去抢(黑产!),导致我们用手的人很难抢到。那么限流器就可以限制一下这些通过脚本去抢购的用户,强烈建议某东优化!1. 简单计数限流器首先要介绍的原创 2021-08-11 18:03:26 · 1600 阅读 · 1 评论 -
GOTT-提升代码可读性
Golang On The Toilet–Readablegolang on the toilt 该名称源于「谷歌」的 google on the toilet,谷歌公司会在厕所里贴一些技术上的小知识点或注意点,让大家在上厕所的时候都可以学习一下。所以本篇博客,也是诺列一些在平时开发中,使用 golang 的一些小知识点。提升代码的可读性总结一句话就是,你写的代码,不要仅限于别人能看懂,而且还要轻松的看懂。不要在交接工作或者同事要看你代码学习的时候,同事心里骂娘。要写一些简单并且可读性高的代码。原创 2021-07-06 22:13:20 · 264 阅读 · 1 评论 -
Golang Map 学习笔记
Golang Map 学习笔记通过阅读大神博客,简单记录学习笔记https://www.qcrao.com/2019/05/22/dive-into-go-map/Map 的数据结构在源码中,map 的结构体叫 hmap,意思是 hashmap。// A header for a Go map.type hmap struct { // 元素个数,调用 len(map) 时,直接返回此值 count int flags uint8 // buckets 的对数原创 2021-07-05 17:36:11 · 380 阅读 · 0 评论 -
Golang slice 和 array
slice vs array1. array数据是 Golang 里最基本的类型,它的类型由元素类型和元素个数共同决定,因此 [3]int 和 [4]int 是两种类型。数据的类型在编译期间就决定了,数据的元素个数是常量,因此数组是无法扩容的。Golang 有两种数据声明方式// 1. 显式指定数据的长度array1 := [3]int{1, 2, 3}// 2. 由初始化的元素个数来推导数据长度array2 := [...]int{1, 2, 3}array2 的数组元素个数由初始化的元原创 2021-06-05 17:58:34 · 432 阅读 · 0 评论 -
Golang 为什么不能直接将任意类型数组赋值给 []interface{}
Golang 为什么不能直接将任意类型数组赋值给 []interface{}本篇参考: https://github.com/golang/go/wiki/InterfaceSlice当我在写 go 代码时,想用 []interface{} 类型来接受一个任意类型的数组,从而进行泛型操作时,发现直接赋值会发生错误,导致 panic。 dataSlice := []int{1, 2, 3, 4, 5, 6} var interfaceSlice []interface{} = dataSlice原创 2021-04-28 15:57:37 · 2630 阅读 · 0 评论 -
Golang 等比例调整图片分辨率且用黑色补齐多余部分
描述随意上传一张图片,将图片的分辨率等比率压缩至 108*108 的格式,若图片不是正方形,则多余部分使用黑色填充。大体思路首先将图片进行解码。将图片分辨率等比例压缩至 108*108 。创建一个黑色的 108*108 的图片,在黑色图片上把压缩过的图片画在正中间。最后再创建新的图片/编码。完整代码package mainimport ( "bufio" "bytes" "fmt" "github.com/nfnt/resize" "image" "image/draw"原创 2021-02-20 17:22:42 · 1296 阅读 · 0 评论 -
Golang &^操作符
&^ 操作符是(与非)的意思。例如 1 &^ 3 就是将 3 先取反,然后和 1 相与。package mainimport "fmt"func main() { a := 1 // 0000 0001 b := 4 // 0000 0100 fmt.Printf("%08b\n", a&^b)}输出 0000 0001原创 2020-07-23 18:05:42 · 1008 阅读 · 0 评论 -
Golang实现一个简单的单链表
Golang实现一个简单的单链表package listtype Node struct { Data interface{} Next *Node}type List struct { size uint32 head *Node tail *Node}// 构造方法,将所有变量置空func (list *List) init() { (*list).size = 0 (*list).head = nil (*list).tail = nil}func (list原创 2020-07-13 15:13:09 · 323 阅读 · 0 评论 -
Golang 原子操作与互斥锁
Golang 原子操作与互斥锁先来看一个代码package mainimport ( "fmt" "runtime" "sync")var ( counter int32 wg sync.WaitGroup)func main() { wg.Add(2) // 设置需要等待的 goroutine 的数量为 2 go addCounter("Gerald") ...原创 2020-04-14 14:56:21 · 1334 阅读 · 0 评论 -
go test 用法总结
go test 用法总结使用操作在当前目录下使用 go test 会运行当前目录下所有的 test 文件。test 文件命名 xxx_test.gotest 文件里需要运行的方法命名 TestXxx(t *testing.T/b *testing.B) // 测试性能的时候用 b若要跳过当前 test 文件中的某个方法,使用 t.SkipNow()go test 不...原创 2020-03-03 13:28:18 · 4484 阅读 · 0 评论 -
Go 语言操作 MySQL 数据库
Go 语言操作 MySQL 数据库起步首先需要引入一个驱动,在命令行使用 go get 引入即可:go get github.com/go-sql-driver/mysql然后在 import 的时候,只需要该驱动的 init() 函数,所以可以在该驱动前加 _最后使用 database/sql 来操作数据库import ( "database/sql" "fmt"...原创 2019-11-06 20:07:16 · 273 阅读 · 0 评论 -
Golang:如何优雅的让所有子协程执行完后再执行主协程
Golang:如何优雅的让所有子协程执行完后再执行主协程方法一:channel 实现同步使用 channel 来完成同步功能。/*@Time : 2019-10-28 下午 5:30@Author : Gerald@File : 用channel来实现同步@Software: GoLand*/package mainimport ( "fmt")func print...原创 2019-10-28 19:06:18 · 4904 阅读 · 0 评论 -
GoLang:数组的切片失效
GoLang:数组的切片失效学习切片的时候想到一个问题:如果一个切片是引用一个完整的数组,那么给这个切片 append 一个元素后,这个 append 的元素会以什么样的形式存在?先看代码: arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} s := arr[:] s[8] = 666 fmt.Println(arr) fmt.Println(s) f...原创 2019-10-08 21:18:24 · 396 阅读 · 0 评论 -
Go 语言--变量逃逸
Go 语言–变量逃逸堆和栈各有优缺点,该怎么在编程中处理这个问题呢?在 C/C++语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。比如,函数局部变量尽量使用栈;全局变量、结构体成员使用堆分配等。程序员不得不花费很多年的时间在不同的项目中学习、记忆这些概念并加以实践和使用。Go语言将这个过程整合到编译器中,命名为“变量逃逸分析”。这个技术由编译器分析代码的...原创 2019-09-17 20:05:49 · 309 阅读 · 0 评论 -
Go 语言的两种执行流有什么区别
Go 语言的两种执行流有什么区别go build -> go run | go run如果先使用 go build 编译生成可执行文件,可以将可执行文件的放到没有 go 环境的机器上,仍然可以执行。如果直接 go run 源代码,那么如果要在另一台机器上也要运行,那另一台机器也需要 go 环境,不然没办法执行。在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,...原创 2019-09-09 15:13:11 · 316 阅读 · 0 评论