wangxiaoming
博客是很好的总结和记录工具,如果有问题,来不及回复,关注程序员奇点,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
展开
-
Goplantuml 安装
goplantuml 主要用来生成 go 代码 uml 图。原创 2023-05-03 14:52:13 · 337 阅读 · 0 评论 -
GO Select 使用
其中注册的case放到scase中。scase保存有当前case操作的hchan。pollorder指向的是乱序后的scase序号。lockorder中将要保存的是每个case对应的hchan的地址。select最后是scase表示select中只保存了一个case的空间,说明select只是个头部,select后面保存了所有的scase,这段Scases的大小就是tcase。如果回收当前不执行的case所在。执行结果:整个线程会阻塞。原创 2023-05-03 14:36:18 · 609 阅读 · 0 评论 -
Thrift IDL 中的 required、optional、default 问题
response新增required。上游更新,下游没更新,没问题。上游没更新,下游更新,没问题。上游没更新,下游更新,报错。上游更新,下游没更新,报错。原创 2023-02-03 14:13:12 · 1432 阅读 · 0 评论 -
Go 并发问题记录.go传入一个指针类型会存在并发问题
Golang 传入指针并发原创 2022-12-21 17:15:32 · 309 阅读 · 0 评论 -
Go golangci-lint安裝及使用
安裝 InstallMac範例環境:macOS Big SurGo 1.16在macOS可使用Homebrew安裝,在終端機輸入brew install golangci-lint開始安裝。$ brew install golangci-lint...==> Installing dependencies for golangci-lint: go==> Installing golangci-lint dependency: go==> Pouring go--1.原创 2022-12-19 15:25:32 · 1760 阅读 · 0 评论 -
Go-函数作为参数传递
Go-函数作为参数传递编码过程中业务需要将一个函数,作为参数传递到函数内部。Go 语言的匿名函数是一个闭包(Closure)什么是闭包闭包指的是引用了自由变量的函数(未绑定到特定对象的变量,通常在匿名函数外定义),被引用的自由变量将和这个函数一同存在。f := func() { var i int = 1 fmt.Printf("i, j: %d, %d\n", i, j)}即使创造它的上下文环境也不会被释放(比如传递到其他函数或对象中)。或者通俗点说,「闭」的意思是「封闭外原创 2022-09-02 08:04:31 · 776 阅读 · 0 评论 -
Go 实现二分查找算法
二分查找算法简介:二分查找算法对有序数组有效,二分搜索是查找数组中的目标值。给定一个有序数组,查找第一个等于 target 的下标,找不到返回 -1.原创 2022-08-13 11:50:59 · 365 阅读 · 0 评论 -
Kitex 重试机制
Kitex 重试机制什么时候会重试?kitex 狂简目前有如下三种重试机制:超时重试Backup Request(一段时间内未收到响应,进行重试)连接失败重试框架目前有三类重试:超时重试、Backup Request,建连失败重试(默认)。其中建连失败是网络层面问题,由于请求未发出,框架会默认重试,业务无需关注。超时重试超时异常由于网络抖动,下游负载高或者 GC 等导致 GC 卡顿导致超时。如何设置重试策略?异常一般有如下三种:业务自定义异常超时异常非超时框架类异常业务判原创 2022-07-06 16:21:13 · 324 阅读 · 0 评论 -
Go Slice 比较
如何判断 slice 相等,就是两个 slice 的类型和长度相同,且下标的值也相等。字节数组判断性能测试,执行命令原创 2022-07-06 15:44:22 · 282 阅读 · 0 评论 -
Go-Redis 中间件
本文基于 redis v6 中 WrapProcess 方法,可以对 redis 前后做操作。https://github.com/go-redis/redis/blob/v6.15.9/redis.goGo Redis 中间件redis.go 中WrapProcess&修改Process方法 支持自己在 redis 操作前后,对操作前后进行处理,类似 Java 中的切片。func (c *baseClient) WrapProcess(fn func(oldProcess func(c原创 2022-05-29 21:57:32 · 837 阅读 · 1 评论 -
Go 中slice,map, chan, strcuct 是值传递么?
Slice 也是值传递么?看个例子吧:func TestSliceReference(t *testing.T) { var args = []int64{1,2,3} fmt.Printf("切片args的地址: %p\n",args) modifiedNumber3(args) fmt.Println(args)}func modifiedNumber3(args []int64) { fmt.Printf("形参切片的地址 %p \n",args) args[0] = 10原创 2022-02-22 11:24:13 · 518 阅读 · 0 评论 -
Go数据库操作异常处理
Go 数据库操作异常处理插入操作第一种写法err := db.Model(&XXX{}).Create(order).Error if err != nil { logs.CtxError(ctx, "Create XXX failed, err:%v", err.Error()) return err }第二种写法db := db.Model(&XXX{}).Create(order) if db.Error != nil { logs.CtxError(c原创 2022-02-19 22:47:36 · 384 阅读 · 0 评论 -
Gorm 高级查询语句
前言越高级,越复杂的查询,也同时意味着高耗,但是平时有一些数据少,但是业务复杂的场景,可以使用下。 这里主要说明的是 go 中使用 gorm 进务查询。gorm import 依赖 "database/sql" "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql"将查询结果放到一个 struct 中// 根据主键查询第一条记录db.First(&user)//// SELECT * FR原创 2022-02-13 14:41:42 · 601 阅读 · 0 评论 -
Go Redis Client 配置
前言Go Redis 采用的是 new Client 方式初始化一个 client 实例, 一个 client 示例会给每个后端 proxy(codis-proxy) 建立一个连接池 connPool,每次调用 client 的方法时, client 会轮训选择一个 connPool, 然后再选择一个 conn 来请求真正的 redis proxy创建一个 Redis 客户端rdb := redis.NewClient(&redis.Options{ Addr: "172.原创 2022-02-12 16:44:22 · 690 阅读 · 0 评论 -
Go 字符串比较
golang 字符串比较字符串比较, 可以直接使用 == 进行比较, 也可用用 strings.Compare 比较go 中字符串比较有三种方式:== 比较strings.Compare 比较strings.EquslFold 比较#### 代码示例```gofmt.Println("go"=="go")fmt.Println("GO"=="go")fmt.Println(strings.Compare("GO","go"))fmt.Println(strings.Compar原创 2022-02-02 16:48:43 · 1618 阅读 · 0 评论 -
Go语言JSON 处理
JSON字符串解析到结构体代码示例type User struct { Name string FansCount int64}// 如果反序列化的时候指定明确的结构体和变量类型func TestJsonUnmarshal(t *testing.T) { const jsonStream = ` {"name":"ethancai", "fansCount": 9223372036854775807} ` var user User // 类型为User原创 2022-01-31 11:38:30 · 512 阅读 · 0 评论 -
Go 语言中的label使用
Go 语言中有 goto 这个功能,这个功能会影响代码的可读性, 会让代码结构看起来比较乱。Go语言也支持label(标签)语法:分别是break label和 goto label 、continue label最近有次阅读代码,就看到了这样的 case , 那就说一下这个功能吧。gotogoto 可以无条件的跳转执行的位置,但是不能跨函数,需要配合标签使用。package gotocaseimport ( "fmt" "testing")func TestGoto(t *tes原创 2022-01-31 11:29:08 · 983 阅读 · 0 评论 -
Go 几种深度克隆方式
Java 深度克隆/深度克隆,可以克隆任意数据类型func DeepClone(src interface{}) (interface{}, error) { typ := reflect.TypeOf(src) if typ.Kind() == reflect.Ptr { typ = typ.Elem() dst := reflect.New(typ).Elem() b, _ := json.Marshal(src) if err := json.Unmarshal(b, dst原创 2021-12-23 10:46:11 · 927 阅读 · 0 评论 -
使用 gorm.DefaultTableNameHandler 可能存在的问题
有这样的业务场景, 线上一个表 tablea, 先生环境还有一个镜像表 tablea_mirror, 你需要当 请求中有一些 tag 标识的时候,访问 tablea_mirror 表import ( "code.byted.org/gopkg/gorm" "context")type dbStagingPostfixKeyType struct{}var dbStagingPostfixKey = dbStagingPostfixKeyType{}func WithDbStagingP原创 2021-12-15 16:35:01 · 1337 阅读 · 0 评论 -
MacOS 安装 go-sqlite3 问题与解决
如果直接下载的话,报错如下:go get github.com/mattn/go-sqlite3go get: module github.com/mattn/go-sqlite3: reading https://athens.azurefd.net/github.com/mattn/go-sqlite3/@v/list: 504 Gateway Timeout第一步Mac OS X1. 经过 Homebrewn 安装: htmlbrew install pkgconfigbrew in原创 2021-12-12 17:15:20 · 583 阅读 · 0 评论 -
Golang代码循环依赖问题|8月更文挑战
什么是循环依赖其实就 package A 引入了 package B ,然后 package B 又引入了 package A ,因此形成了循环依赖。现象如下:测试代码package Aimport ( "strings" B “/GoProject/main/gobase/cycle/b")func Foo(a string) (string) { return B.Add(a)}func Minus(a string) (string) { return string原创 2021-11-21 15:02:12 · 613 阅读 · 0 评论 -
Go 语言GC原理概述
GCGC 这个问题,Java 开发者应该十分熟悉, GC 是一种自动管理内存的机制,垃圾回收器尝试回收程序不使用的对象与占用的内存。GO 语言的 GCgolang-GC 是基于标记-清除 的三色标记法。黑、灰 、白黑色:该对象已经被标记过了,且对象下的属性也全部被标记过了灰色:该对象已经被标记过了,但该对象下的属性没有完全被标记(GC 需要从对象中寻找垃圾)白色:该对象没有被标记过(对象垃圾)GC过程其实跟 Java 中的有点类似。Stack Scan : 收集根对象(全局变量和原创 2021-11-15 10:29:20 · 933 阅读 · 0 评论 -
Go 语言 mapstructure 使用
参考资料https://pkg.go.dev/github.com/mitchellh/mapstructurehttps://segmentfault.com/a/1190000023442894原创 2021-11-13 21:42:53 · 2108 阅读 · 0 评论 -
Golang 内存分配思想
前言在理解 GC 之前,先了解下内存分配逻辑。内存分配器程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要的区域:栈区(Stack)和堆区(Heap)函数调的参数,返回值,局部变量大部分会分配到栈上,这部分内存会用编译器进行管理。不同编程语言使用不同的方法管理堆内存, C++ 等编出语言由工程师和申请和释放,Go 与 Java 由工程师和编译器共同管理。堆中的对象由内存分配期分配并由垃圾收集器回收。内存管理基础概念内存管理一般包含三个不同的组件,分别是用户程序(Mut原创 2021-11-11 10:27:19 · 346 阅读 · 0 评论 -
使用 Go 合并两个文件
本文讲述的是合并两个 json 文件,既然是两个 JSON文件的合并。其实就是把两个结构相似的 JSON 文件合并成一个文件, 这样会涉及到文件的读写.基于 OS 的 文件读写file, _ := os.Open("test.txt") // 读文件// 写文件file, _ := os.OpenFile("test2.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0664)defer file.Close()data := []byte("hel原创 2021-11-11 10:18:55 · 1031 阅读 · 0 评论 -
Go的静态探测器
前言并发问题Race conditions 是隐晦容易出错的地方, 加上 go 中新建协程十分方便,只需要在方法前写个 go 就可以。 在代码部署到生产后很长时间才会发作。会导致一些比较难以琢磨的问题。为了检测出可能存在的并发问题, Go 1.1 中引入了竞态检测器, 基于 C/C++ ThreadSanitizer 实现。已经在在 Go 中集成。简介Race conditions are among the most insidious and elusive programming errors原创 2021-11-06 00:23:50 · 253 阅读 · 0 评论 -
API设计和数据库设计原则有哪些?
面试官: 技术方案一般要遵守哪些原则?候选人: SOLID 原则?此时,脑海中浮现出这么一张图:面试官: 数据库怎么设计原创 2021-11-06 00:23:17 · 221 阅读 · 0 评论 -
Go 限流器 limter
Go 实现熔断器https://blog.csdn.net/weixin_46825193/article/details/107032136-https://mp.weixin.qq.com/s?__biz=MzA3MjgwNTQ3OA%3D%3D&chksm=9f19ff27a86e76319e144c77418bdc64bf36abe9aa59edc0bf7c058a6c0003efbf096c4cc049&idx=1&mid=2247483950&scene=2原创 2021-11-06 00:22:46 · 807 阅读 · 0 评论 -
Go 排查内存占用过高问题
下载测试代码go get 中可以获取测试程序, 注意加上 -d 避免下载后自动安装。Githubgo get -d github.com/wolfogre/go-pprof-practicecd $GOPATH/src/github.com/wolfogre/go-pprof-practice如果 go get 下载不了, 可以 git clone 下载gir clone https://github.com/wolfogre/go-pprof-practice对代码进行编译然后运行g原创 2021-09-13 10:55:15 · 1161 阅读 · 0 评论 -
Go tool 问题排查- 协程泄漏问题
内推美团:求一份 Java 简历,坐标:北京。左边二维码有我联系方式下载测试代码go get 中可以获取测试程序, 注意加上 -d 避免下载后自动安装。Githubgo get -d github.com/wolfogre/go-pprof-practicecd $GOPATH/src/github.com/wolfogre/go-pprof-practice如果 go get 下载不了, 可以 git clone 下载gir clone https://github.com/wolfog原创 2021-09-13 10:38:27 · 222 阅读 · 0 评论 -
Go 语言中 channel 内存模型
内存模型Go 内存模型描述的是 “在一个 groutine 中对变量进行读操作能够侦测到在其他 gorountine 中对改变量的写操作” 的条件。happen-before假设 A 和 B 表示一个线程执行的两个操作,如果 A happen-before B 那么 A 操作的声明在 B 之前。我们回过头来再看看"The Go Memory Model"中关于happens-before的部分。如果满足下面条件,对变量v的读操作r可以侦测到对变量v的写操作w:r does not happen原创 2021-09-12 18:33:03 · 232 阅读 · 0 评论 -
如何排查Go 程序 CPU 占用过高问题
参考资料https://blog.wolfogre.com/posts/go-ppof-practice/#%E6%8E%92%E6%9F%A5-cpu-%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98原创 2021-09-01 21:53:40 · 2091 阅读 · 1 评论 -
Go Defer 关键字原理浅析
Go 关键字- Deferdeferdefer 修饰的函数是一个延迟函数,在包含它的函数返回时运行type _defer struct { siz int32 // 由deferproc第一个参数传入,参数和结果的内存大小 started bool // 标识defer函数是否已经开始执行 heap bool // 堆分配、栈分配 openDefer bool //表示当前 defer 是否经过开放编码的优化 sp uintptr // 栈原创 2021-08-31 11:22:41 · 175 阅读 · 0 评论 -
Go 安装第三方包 与 GoLand 导入第三方包
一、 通过 go get github.com/go-sql-driver/mysql 命令安装第三方类库要启用 go get github.com/go-sql-driver/mysql 命令,首先必须设置环境变量GOPATH的路径、并且安装git for windows!!! 否则 go get 命令不起作用。设置 GOPATH 环境变量, 并且这个GOPATH 变量里面的路径不能有分号; 否则会报错右键我的电脑——高级系统设置——环境变量,系统变量下 点击【新建】输入:原创 2021-02-01 14:44:45 · 10114 阅读 · 2 评论 -
Go语言中http响应关闭
为什么需要response.Body.Close()主要是为了避免内存泄漏的问题, 如果 response 不关闭,会导致内存泄漏。关闭http 的响应当你使用标准http库发起请求时,你得到一个http的响应变量。如果你不读取响应主体,你依旧需要关闭它。注意对于空的响应你也一定要这么做。对于新的Go开发者而言,这个很容易就会忘掉。先看段代码:package mainimport ( "fmt" "net/http" "io/ioutil")func main()原创 2021-08-28 15:11:27 · 1089 阅读 · 1 评论 -
Go slice 原理
创建方式 nil切片 空切片方式一 var s1 []int var s2 = []int{}方式二 var s4 = *new([]int) var s3 = make([]int, 0)长度 0 0容量 0 0和 nil 比较 true false参考资料https://www.cnblogs.com/qcrao-2018/p/10631989.html原创 2021-07-25 15:46:32 · 191 阅读 · 0 评论 -
sync.Pool 使用
sync.Pool 使用场景保存和复用临时对象,减少内存分配,降低 GC 压力type Student struct { Name string Age int32 Remark [1024]byte}var buf, _ = json.Marshal(Student{Name: "Geektutu", Age: 25})func unmarsh() { stu := &Student{} json.Unmarshal(buf, stu)}参考资料ht原创 2021-07-18 10:33:07 · 1910 阅读 · 0 评论 -
Go 设计模式 - 装饰器模式
设计模式装饰器模式装饰器模式主要解决继承关系过于复杂的问题,通过组合来代替继承,给原始类添加增强功能,这也是判断装饰器的一个重要依据,除此之外,装饰器还有一个特点,可以对原始类嵌套多个...原创 2021-07-14 10:01:11 · 221 阅读 · 0 评论 -
Go 设计模式-观察者模式
设计模式观察者模式观察者模式,也被称为发布订阅模式(Publish-Subscribe Design Pattern)Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.翻译中文:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会原创 2021-07-13 09:48:01 · 188 阅读 · 0 评论 -
Go 设计模式-策略模式
设计模式策略模式策略模式定义一组算法类,将每个算法分别封装起来,让他们可以相互替换,策略模式可以使得算法独立于客户端,策略模式用来解耦策略的定义,创建,使用。一般来说策略模式也是包含 定义,创建,和使用 三个部分。策略模式和工厂模式有点泪说,只是多了策略这一部分,运用场景策略模式最常用的场景是,利用它来避免冗长的if-else 或者 switch 分支判断它的作用不止如此,可以跟模板模式一样,提供框架的扩展点。策略模式的主要作用是解耦策略的定义,创建,使用,控制代码的复杂度参考资料原创 2021-07-10 10:36:36 · 234 阅读 · 0 评论