go语言
文章平均质量分 65
老赵骑摩托
学到很多东西的诀窍,就是不要一下子学很多
展开
-
获取嵌套结构体字段总数
获取嵌套结构体字段总数原创 2022-08-16 19:44:01 · 255 阅读 · 1 评论 -
【go实现】任意类型结构体比较
func main(){ fmt.Println(Equal(1,1))}func isFunction(arg interface{}) bool { if arg == nil { return false } return reflect.TypeOf(arg).Kind() == reflect.Func}func validateEqualArgs(expected, actual interface{}) error { if expected == nil &&a原创 2021-11-20 17:37:28 · 524 阅读 · 0 评论 -
golang 详解协程——errgroup
为什么要有sync.errgroupgo支持并发,一般采用的是 channel 或者 sync.WaitGroup ,来实现各个协程之间的流程控制和消息传递。但是对于开启的成千上万的协程,如果在每个协程内都自行去打印 错误日志的话,会造成日志分散,不好分析。所以我们要实现一种能统一处理各个协程错误的工具什么是 sync.errgroupGo团队在实验仓库中添加了一个名为sync.errgroup的新软件包。 sync.ErrGroup再sync.WaitGroup功能的基础上,增加了错误传递,以及原创 2021-07-06 14:42:46 · 1629 阅读 · 1 评论 -
利用DEBUG调试,查看程序GMP调用情况
利用DEBUG调试,查看程序GMP调用情况先编译go文件go build test.go开启调试信息GODEBUG=schedtrace=1000 ./test.exe1000指的是打印时间间隔调试后,控制台会输出如下内容SCHED 0ms: gomaxprocs=6 idleprocs=5 threads=6 spinningthreads=0 idlethreads=3 runqueue=0 [0 0 0 0 0 0]我们来分析下上面这些内容的含义(不了解GMP模型的绕道).原创 2021-06-08 10:25:40 · 130 阅读 · 0 评论 -
go interface 是否可以比较
go interface 是否可以比较interface 有些情况是可以比较的,但分为几种不同的情况空interface 比较不可直接比较类型空interface 实例比较 不赋值import "fmt"type a interface { //bb() int}type b interface { //bb() int}func main() { var c a var d b fmt.Println(c == d)}空接口类型的实例是可以比较的,结果为t原创 2021-04-12 10:54:35 · 2580 阅读 · 0 评论 -
详解 golang 的 defer (转载收藏)
https://mp.weixin.qq.com/s/FUmoBB8OHNSfy7STR0GsWw转载 2021-03-18 14:46:38 · 52 阅读 · 0 评论 -
go http handler
1、handler 概念handler 是一个 inrerface。下面仅有一个方法 ServeHTTPtype Handler interface { ServeHTTP(ResponseWriter, *Request)}ServeHTTP 一共两个参数第一个参数 ResponseWriter 是用来 写相应的第二个参数是 一个指向 request 结构体的指针。这个request 值得就是我们 的请求。里面包含一些请求的信息只要含有我们这个ServeHTTP方法,就是一个han原创 2021-03-11 15:22:44 · 914 阅读 · 2 评论 -
golang 反射
1、什么是反射在运行时 动态获取 变量的 类型(type)和 类别(kind)如果是结构体实例,可以获取到结构体的信息通过反射可以修改 变量的值。可以调用关联的方法反射的包 reflect反射的本质是 运行时 的我们主要学习 其中type 和 value 的方法在反射中 , 变量、interface、和 reflect 之间是可以相互转换的2、反射的应用场景序列化和反序列化不知道函数调用哪个函数,可通过反射来确定3、反射的方法3.1 reflect.TypeOffu原创 2021-03-10 13:53:39 · 248 阅读 · 0 评论 -
go 类型断言
1、什么是类型断言由于 interface 是 一般类型,不是具体类型。如果要转成具体类型,就需要使用类型断言直接将 x 的值 赋给 a 是不可以的,编译前检查都过不去断言后可成功赋值,输出结果为 52、带检查的类型断言类型断言有时候会失败,比如断言时传入的类型于 interface 指向的类型不一致,这样会导致程序 panic ,无法正常运行我们需要检查断言是否成功以及结果是否有效func main() { var x interface{} a := 1 x =原创 2021-03-09 15:09:32 · 346 阅读 · 0 评论 -
深入了解golang 的channel
文章目录1、channel 是什么channel的特点2、channel 的数据结构hchan等待队列和发送队列的类型包装 sudog3、channel 分类有缓冲channel无缓冲channel4、channel 的创建4.1 分配 hchan4.2 分配buf4.3 makeChan 源码5、发送数据5.1 对channel加锁5.2 将数据拷贝到 buf5.3 对channel 解锁6、接收数据6.1 先对channel上锁6.2 从 buf 中拷出接收的数据6.3 解锁7、如果发送时,buf 数据原创 2021-03-08 18:25:06 · 1027 阅读 · 0 评论 -
golang 读写锁原理
读写锁 RWMutex1、概念读写锁和互斥锁都是为了防止并发而加的锁读写锁相比互斥锁,就是增加了对读写的控制读写锁 写写之间是互斥的,读写也是互斥的,但是读锁 是可以添加多个的2、RWMutex 代码type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing原创 2021-03-05 15:00:28 · 1244 阅读 · 1 评论 -
golang 互斥锁原理
互斥锁1、互斥锁概念对于同一份资源来说,为了保证 在多个线程或者协程同时访问的时候,保证数据的读取不会出现错误。互斥锁相对于 读写锁而言更加绝对一些,互斥锁不论是读写,加过锁后,都是互斥的,需要等待2、Mutex 数据结构type Mutex struct { state int32 // 互斥锁状态 sema uint32 // 信号量}sema 表示信号量,用来控制 goroutine 的 阻塞休眠和唤醒。协程阻塞时等待该信号量,协程解锁是释放该信号量并唤醒等待信号量的协原创 2021-03-04 17:14:53 · 1267 阅读 · 1 评论 -
golang的后台编译流程
先了解编译相关的基本概念环境变量相关仅列举一些常用的,其他的环境变量可以通过 go env 命令 来查看1、GOROOTgo语言的安装目录,方便我们找到所安装的SDK2、GOPATHgo的工作源码目录,也就是项目代码文件的存放目录。可以写多个值,查找的时候根据顺序进行查找。比如 项目中配置的包的路径一般是相对于项目而言的。比如 imp的包路径 /laozhao/motuo/baoma。对于项目而言,项目在本地磁盘的路径是D:/a/b/laozhao/… ;这时,必须配置GOPAT.原创 2021-03-04 10:30:04 · 442 阅读 · 3 评论 -
搞懂golang make和new的区别
make和new都是用来分配内存的。相比make,new的使用场景很少。面试经常被问,来看看这两个具体什么区别new// The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *.原创 2021-03-03 11:43:21 · 489 阅读 · 3 评论 -
go 逃逸分析
go 逃逸分析看逃逸分析首先要知道清楚堆和栈的概念堆和栈堆存储全局变量、占用内存比较大的局部变量。人为干预的,手动申请、分配和释放堆的内存没有特定的结构和大小,可以根据需要进行调整。堆是进程级别的。开销会比较大,对于go这种带GC的语言来说,也会增加gc压力,同时也容易造成内存碎片。堆分配内存的时候需要先找到一个大小合适的内存块,最后通过垃圾回收进行释放栈存储局部变量、返回值、函数参数这些数据由编译器进行管理,因此栈的分配和回收的速度非常快栈的内存通过命令 PUSH 和 REL原创 2021-03-01 17:41:27 · 196 阅读 · 0 评论 -
玩好go的切片
go的slice ,入门就会遇到,但这个东西大多数人都是停留在简单的使用。一些干了好几年的老程序员都说不明白里面的道道,这里面坑不少。恰巧今天有空,好好整理下,永不踩坑为什么要用切片其他语言大多用的都是数组,在go中,数组的长度是不可变化的,声明后就是固定的,所以go有了切片,长度是可变化的我们平时用的最多的也是切片。什么是切片基本概念slice切片是数组的引用类型,故是引用传递(其实是值传递,下面会细细分析)切片的使用和数组类似切片的长度是可以变化的(动态变化的数组)切片的定义语法.原创 2021-02-26 18:21:57 · 284 阅读 · 3 评论 -
静态类型和动态类型
静态类型和动态类型https://www.jianshu.com/p/bc492fcbf18f编程语言按照类型检查可以分为两大类:静态类型 (Static Typing) 和 动态类型 (Dynamic Typing)。在现在比较流行的这些语言里,静态类型的代表人物有 Java、C/C++、Golang 等,动态类型有 Python、Ruby 等。静态类型语言中,变量具有类型,而且在编译期确定,具有某一类型的变量只能持有相同类型的数据。动态类型语言中,变量没有类型,只有数据有类型,变量可以持有任意类型原创 2020-08-11 21:16:07 · 2066 阅读 · 0 评论 -
golang
golang是啥Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Golang优势1.开发速度:Go 语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。2.并发:Go 语言对并发的支持是这门语言最重要的特性之一。goroutine 很像线程,但是它占用的内存远少于线程,使用它需要的代码原创 2020-08-11 20:42:32 · 103 阅读 · 0 评论 -
理解golang调度
线程模型在细说 Go 的调度模型之前,先来说说一般意义的线程模型。线程模型一般分三种,由用户级线程和 OS 线程的不同对应关系决定的。N:1,即全部用户线程都映射到一个OS线程上,上下文切换成本最低,但无法利用多核资源;1:1 , 一个用户线程对应到一个 OS线程上, 能利用到多核资源,但是上下文切换成本较高,这也是 Java Hotspot VM 的默认实现;M:N,权衡上面两者方案,既能利用多核资源也能尽可能减少上下文切换成本,但是调度算法的实现成本偏高。为什么 Go Scheduler 需要原创 2020-08-11 21:03:52 · 278 阅读 · 0 评论