Golang
文章平均质量分 68
Golang开发技术分享
FeelTouch Labs
这个作者很懒,什么都没留下…
展开
-
GoLang核心知识点
很多时候我们的一个Struct不止具有一个功能,比如我们需要JSON的互转、还需要BSON以及ORM解析的互转,所以一个字段可能对应多个不同的Tag,以便满足不同的功能场景。Struct Tag可以提供字符串到Struct的映射能力,以便我们作转换,除此之外,还可以作为字段的元数据的配置,提供我们需要的配置,比如生成Swagger文档等。通过反射,我们可以获取一个结构体类型的字段,也可以获取一个类型的导出方法,这样我们就可以在运行时了解一个类型的结构,这是一个非常强大的功能。可以通过反射获取字段的tag。原创 2024-04-17 17:22:22 · 840 阅读 · 0 评论 -
Go 项目必备:深入浅出 Wire 依赖注入工具
当项目中实例依赖(组件)的数量越来越多,如果还是人工手动编写初始化代码和维护组件之间依赖关系的话,会是一件非常繁琐的事情,而且在大仓中尤其明显。因此,社区里已经有了不少的依赖注入框架。除了来自 Google 的 Wire 以外,还有(Uber) 、(Facebook)。其中 Dig 和 Inject 都是基于 Golang 的 Reflection 来实现的。这不仅对性能产生影响,而且依赖注入的机制对使用者不透明,非常的“黑盒”。— Rob Pike相比之下,Wire 完全基于代码生成。原创 2023-11-10 16:18:16 · 561 阅读 · 0 评论 -
GO 中 Chan 实现原理
tag说明qcount当前的队列,剩余元素个数dataqsiz环形队列可以存放的元素个数,也就是环形队列的长度buf指针,指向环形队列elemsize指的的队列中每个元素的大小closed具体标识关闭的状态elemtype见名知意,元素的类型sendx发送队列的下标,向队列中写入数据的时候,存放在队列中的位置recvx接受队列的下标,从队列的 这个位置开始读取数据recvq协程队列,等待读取消息的协程队列sendq协程队列,等待发送消息的协程队列lock互斥锁,在 chan 中,不可以并发的读写数据。转载 2023-11-10 14:22:21 · 406 阅读 · 0 评论 -
Go语言内存对齐详解
有些CPU可以访问任意地址上的任意数据,而有些CPU只能在特定地址访问数据,因此不同硬件平台具有差异性,这样的代码就不具有移植性,如果在编译时,将分配的内存进行对齐,这就具有平台可以移植性了。CPU访问内存时并不是逐个字节访问,而是以字长(word size)为单位访问,例如 32位的CPU 字长是4字节,64位的是8字节。如果变量的地址没有对齐,可能需要多次访问才能完整读取到变量内容,而对齐后可能就只需要一次内存访问,因此内存对齐可以减少CPU访问内存的次数,加大CPU访问内存的吞吐量。转载 2023-04-05 16:32:54 · 414 阅读 · 0 评论 -
Go语言 unsafe.Pointer 浅析
Pointer 表示指向任意类型的指针,对于该类型有四种合法的操作:任意类型的指针可以转为 PointerPointer 可以转为任意类型的指针uintptr 可以转为 PointerPointer 可以转为 uintptr转载 2023-04-05 16:22:40 · 617 阅读 · 0 评论 -
Go Resources Go资源
Go Resources原创 2023-03-20 01:01:40 · 316 阅读 · 0 评论 -
Unbuntu 一键安装制定版本的Go环境
安装完成后运行以下命令查看版本。原创 2023-03-19 14:05:28 · 367 阅读 · 0 评论 -
Go 内存分布
映射、通道和函数类型的内部定义// 映射类型type _map *hashtableImpl // 目前,官方标准编译器是使用// 哈希表来实现映射的。// 通道类型// 函数类型这三个种类的类型的内部结构其实是一个指针类型。或者说,这些类型的值的直接部分在内部是一个指针。这些类型的每个值的直接部分引用着它的具体实现的底层间接部分。切片类型的内部定义elements unsafe.Pointer // 引用着底层的元素lenint// 当前的元素个数capint// 切片的容量}原创 2023-03-05 00:35:21 · 503 阅读 · 0 评论 -
Go服务Docker Pod不断重启排查和解决
Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包。原创 2023-03-04 21:19:35 · 1108 阅读 · 2 评论 -
Go struct
一个结构体类型的尺寸为它的所有字段的(类型)尺寸之和加上一些填充字节的数目。两个类型分别为S1和S2的结构体值只有在S1和S2的底层类型相同(忽略掉字段标签)的情况下才能相互转换为对方的类型。不可寻址的字段的值是不可更改的。当一个(源)结构体值被赋值给另外一个(目标)结构体值时,其效果和逐个将源结构体值的各个字段赋值给目标结构体值的各个对应字段的效果是一样的。一般来说,只有可被寻址的值才能被取地址,但是Go中有一个语法糖(语法例外):虽然所有的组合字面量都是不可寻址的,但是它们都可被取地址。原创 2023-03-04 09:53:50 · 481 阅读 · 0 评论 -
Go 指针
一般说来,一个可寻址的值是指被放置在内存中某固定位置处的一个值(但放置在某固定位置处的一个值并非一定是可寻址的)。通过将double函数的输入参数的类型改为*int,传入的实参&a和它在此函数体内的一个副本x都引用着变量a。如果一个指针类型的基类型为T,则我们可以称此指针类型为一个T指针类型。当然,在此函数体内对传入的指针实参的修改x = nil依旧不能反映到函数外,因为此修改发生在此指针的一个副本上。对于基类型为T的指针类型的一个指针值p,我们可以用*p来表示地址p处的值。*p称为指针p的解引用。原创 2023-03-04 09:47:02 · 617 阅读 · 1 评论 -
GoLang中使用Gorilla Websocket异常处理
在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。如果我们的整个系统按预期工作,则服务器将接收间隔为1秒的数据包,并回复相同的消息。客户端还将具有接收传入的Websocket数据包的功能。在我们的程序中,我们将有一个单独的goroutine处理程序。如果您的Web应用程序使用单独的前端,则通常Websocket客户端将以该语言(Javascript等)实现。但是,出于说明的目的,我们将在Go中同时编写客户端程序和服务器程序。转载 2023-02-10 18:28:37 · 1251 阅读 · 0 评论 -
Go中init()执行顺序分析
在运行启动时,最后导入的包会最先初始化并调用其init()函数,原创 2022-09-15 13:35:40 · 492 阅读 · 0 评论 -
Golang 对象深拷贝的方案以及性能比较
从性能上来讲 custom>json>gob,从代码数量上来讲 gob>json>custom ,因此具体使用时应该充分考虑性能和代码复杂度,若性能要求不是很高建议gob方法,其比较简洁并且利于生成工具包,若要求性能则尽量使用custom,此处不偷懒可以提高性能哦。Go语言中所有赋值操作都是值传递,如果结构中不含指针,则直接赋值就是深度拷贝;如果结构中含有指针(包括自定义指针,以及切片,map等使用了指针的内置类型),则数据源和拷贝之间对应指针会共同指向同一块内存,这时深度拷贝需要特别处理。原创 2022-09-08 21:27:28 · 1649 阅读 · 0 评论 -
中秋实验揭示gin下ShouldBindJSON、ShouldBindWith的json到对象映射程序是怎么跑飞的[Go 避坑必备之良好的编码习惯很重要]
虽然这个实验看似无关痛痒,但却对从事软件开发的工程师给出了一个提醒:要养成良好的编码风格和素养,要认真测试CASE,不然程序真就跑飞了。针对这个实验去探究gin下ShouldBindJSON、ShouldBindWith的json到对象映射的原理以及在使用时对其进行深刻理解和把握是必要的,但是多数工程师可能做不到,那么就请养成良好的编码习惯和风格,不然等着程序员的就是莫名其妙的BUG。原创 2022-09-08 21:19:19 · 890 阅读 · 1 评论 -
Golang常见错误集锦
当我们在 Golang 中使用 errors.New(“Aaa.”) 或者 fmt.Errorf(“Aaa.”) 形式返回 error 信息时,文字内容不应该以大写字母开头或者标点符号结尾。只有按照警告的去修改 去掉大写字母开头 和 标点符号结尾 errors.New(“aaa”)错误字符串不应该大写或以标点符号结束。原创 2022-09-02 21:58:40 · 800 阅读 · 0 评论 -
【写在七夕浪浪漫时刻】Go中遇到http code 206和302的获取数据的解决方案
七夕来袭!显然是一个值得开心和庆祝的日子,但是做为程序员的我们要想放肆玩、放开乐,前提还是把手头的工作做好才行所以,本篇文章以解决程序员同学很可能遇到的两个难题为切入点,给出问题展示、思路分析、解决方案,以便程序员可以快速完成工作,然后心无旁骛的与自己的另一半进行双向奔赴,嘎嘎。............原创 2022-08-04 23:59:27 · 4683 阅读 · 0 评论 -
Golang协程goroutine的调度与状态变迁分析
Go运行时的调度器其实可以看成OS调度器的某种简化版本,一个goroutine在其生命周期之中,同样包含了各种状态的变换。弄清了这些状态及状态间切换的原理,对搞清整个Go调度器会非常有帮助。原创 2022-08-01 21:53:46 · 718 阅读 · 0 评论 -
Golang内存分析工具gctrace和pprof实战
gctrace用途主要是用于跟踪GC的不同阶段的耗时与GC前后的内存量对比。使用的时候仅需在启动的时候添加GODEBUG='gctrace=1'的命令参数即可。如下。原创 2022-07-30 12:28:18 · 1511 阅读 · 0 评论 -
实验深度理解Go中try...catch...的panic、defer、recover用法
1.defer用于资源的释放,会在函数返回之前进行调用。2. return xxx不是一条原子指令,而是 赋值 + return 指令的结合3.defer是在return之前执行的。原创 2022-06-17 09:09:41 · 520 阅读 · 0 评论 -
Golang进阶的好书和资料
Go(又称“Golang”)是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。2009 年 11 月正式成为开放源代码项目。2016 年,被软件评价公司 TIOBE 选为“TIOBE 2016 年最佳语言”。在鹅厂,Go 成为了 2021 年新增代码量最多的编程语言。点击查看腾讯2021年研发大数据报告本期《大牛书单》,我们就请来了几位鹅厂同事,为大家推荐一些学习 Go 的书籍,一起多读书多进步。.转载 2022-05-18 17:18:40 · 323 阅读 · 0 评论 -
一文吃透Go内存管理
想深入了解Go语言的内存管理实现,必然绕不开「Go内存管理单元mspan」,Go堆内存、栈内存的分配过程都依赖了「内存管理单元mspan」。今天我们就通过几张图,层层深入并解开「Go内存管理单元mspan」的神秘面纱。本文包含的具体概念如下: page的概念 mspan的概念 object的概念 FreeList的概念 sizeclass的概念 spanclass的概念 正文介绍Go内存管理单元mspan前,需要先看下page的概念...转载 2022-05-14 00:02:12 · 713 阅读 · 0 评论 -
Go实现json字符串与各类struct相互转换
不废话了都在代码中了 package main import ( "fmt" "reflect" "encoding/json" "strings") type Class struct { Grade int `json:"grade"` //年级 ClassNumber int `json:"classNumber"` //班级号} type Student struct{ Name string //大写开头,可被导出,没有`j.原创 2022-05-12 20:04:31 · 3352 阅读 · 0 评论 -
Go 1.18新特性长文解读
2022年3月15日,Go团队在官方博客上官宣了Go 1.18正式版的发布。Go 1.18这个网红版本终于落地了。泛型的加入让Go 1.18成为继Go 1.0(首个正式版)、Go 1.5(实现自举、去C代码、新版GC)、Go 1.11(引入Go module)版本之后的又一里程碑版本。泛型是Go语言开源以来最大的语法特性变化,其改动和影响都很大,Go核心团队尽管很努力了,但Go 1.18正式版本的发布时间还是延迟了一个月。不过好消息是加入泛型语法的Go 1.18继续保持了Go 1兼容性,这本身就是Go团转载 2022-05-07 00:17:37 · 2198 阅读 · 0 评论 -
Go 高性能编程心法探秘
代码的稳健、可读和高效是我们每一个 coder 的共同追求。本文将结合 Go 语言特性,为书写效率更高的代码,从常用数据结构、内存管理和并发,三个方面给出相关建议。话不多说,让我们一起学习 Go 高性能编程的技法吧。常用数据结构1.反射虽好,切莫贪杯标准库 reflect 为 Go 语言提供了运行时动态获取对象的类型和值以及动态创建对象的能力。反射可以帮助抽象和简化代码,提高开发效率。Go 语言标准库以及很多开源软件中都使用了 Go 语言的反射能力,例如用于序列化和反序列化的 json、.原创 2022-03-23 22:10:44 · 1025 阅读 · 0 评论 -
Go引用包版本更新但是被引用的包的子包并没有出现在vendor中的问题和解决方案
问题现象1. A服务引用B包的版本 v0.1.12.B包进行升级添加了子包httpclient和工具文件env.go,并发布了版本v0.1.23.在A服务的go.mod模块将B的引用升级到v0.1.24.在A服务依次执行go mod tidy; go mod vendor继续升级,没有错误,提示成功。5. 进入到vendor的对应目录进行检查,确实出现了工具文件env.go,证明确实引用升级到了最新的版本;但是并没有子包httpclient。问题原因目前,我也没找到确切的原因原创 2022-04-20 16:43:14 · 2460 阅读 · 0 评论 -
Go Error module declares its path as but was required as解决方案
问题原因当我准备将Go工程C依赖的仓库A在IDE全部修改替换仓库B(仓库A与仓库B完全一样)时,当然引用的版本没有变化,报出了如下错误:go: downloading github.com/B/lib v0.1.0go get: github.com/B/lib@none updating to github.com/B/lib@v0.1.0: parsing go.mod: module declares its path as: github.com/A/li原创 2022-04-01 17:50:42 · 6970 阅读 · 0 评论 -
Go系列---gofmt格式化代码
gofmt介绍Golang的开发团队制定了统一的官方代码风格,并且推出了gofmt工具(gofmt或go fmt)来帮助开发者格式化他们的代码到统一的风格。gofmt是一个cli程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有.go文件,如果不传参数,会格式化当前目录下的所有.go文件。gofmt默认不对代码进行简化,使用-s参数可以...转载 2020-02-09 01:00:19 · 2562 阅读 · 0 评论 -
Github开源Go系列---手机电脑文件互传工具百灵
简介基于Go语言的高性能 “手机电脑超大文件传输神器”、”局域网共享文件服务器”。LAN large file transfer tool。地址https://github.com/bitepeng/b0pass特征目前可以支持如下这些场景:手机电脑共享文件:电脑上双击执行 –> 手机扫码 –> 手机上的大文件传到电脑、或者电脑传文件到手机。 电脑之间共享文件...原创 2019-12-29 22:23:24 · 2572 阅读 · 0 评论 -
Github开源Go系列---命令行管理文件的工具lf
简介一个直接通过命令形式的目录树可视化文件管理工具。项目地址https://github.com/gokcehan/lf安装命令go get -u github.com/gokcehan/lf特征Cross-platform (Linux, OSX, BSDs, Windows (partial)) Single binary without any runtime...原创 2019-12-29 22:08:47 · 696 阅读 · 0 评论 -
Golang系列2---Golang 中函数作为值与类型
在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了,有时候我们甚至可以利用这一特性进行类型转换。作为值传递的条件是类型具有相同的参数以及相同的返回值。函数的类型转换Go 语言的类型转换基本格式如下:type_name(expression)举个例子:package mainimpo...转载 2019-08-28 01:00:53 · 377 阅读 · 1 评论 -
Golang系列1---Golang 环境配置与应用编译
Go 语言现在是越来越火了,出现在各个领域中,称它为 21 世纪的 C 语言一点都不为过,而且 Go 语言是 2009 年才发布的新语言,可以说它的特性是完全基于现代计算机来设计的,尤其是它的看家本领 goroutine 协程,在高并发场景下使用简直不要太爽,非常适合写一些高性能中间件。而作为 Java 后端开发者的我,早在 2017 年底的时候已经通过业余时间掌握了 Go 语言,并且还手写了...转载 2019-08-28 00:58:33 · 960 阅读 · 0 评论