go
文章平均质量分 55
Bob drudgery
这个作者很懒,什么都没留下…
展开
-
golang json tag 中的 “omitempty“
omitempty转载 2022-01-29 10:42:13 · 1037 阅读 · 0 评论 -
Grpc-go实践
Grpc-go实践上手项目文件目录── client│ └── grpc_client.go├── pb│ └── hello.pb.go├── proto│ └── hello.proto└── server├── greeter│ └── grpc_server.go└── main.go1、编写proto文件(对大小写不敏感,会自动转换)syntax = "proto3";package trip;option go_package="github.c原创 2021-09-12 13:07:40 · 303 阅读 · 0 评论 -
unsafe
unsafe高效转换string和slice参考一、string与[]byte的如何高效转换a:="hello world"b:= []byte(a)string的内存布局:data+lenslice的内存布局:data+len+cap二者都是由一个底层数组储存变量数据,而类型本身只记录这个数组的起始位置。如果采用强制类型转换的方式把a转为b,那么就会重新分配b使用的底层数组,然后把a的底层数组拷贝到b的底层数组,如果字符串内容很多,既费时也浪费内存方案一:unsafe指针类型转换un原创 2021-09-11 18:01:56 · 246 阅读 · 0 评论 -
Golang map十问
1、map的底层底层数据结构:哈希表2、map是否可比较不可以,go中的map,slice,函数值都是不可比较的;其中,map[Key]value中的key必须是可比较的,也就是可以通过 ==或!=操作符进行比较,value的值类型无所谓3、删除一个不存在的key会panic吗?不会,相当于delete()没生效4、对不存在的key取值会发生什么?对不存在key取值,得到类型零值5、map中的value是可以被寻址的吗?不可寻址,对于x=y的赋值操作必须要知道x的地址,所以type M原创 2021-09-10 15:05:35 · 222 阅读 · 0 评论 -
结合consul和grpc手动实现一个负载均衡算法(随机,轮询)
结合consul和grpc手动实现一个负载均衡算法(随机,轮询)参考方案:一、程序结构---balance ---balance.go ---instance.go ---mgr.go ---random.go ---roudrobin.go二、代码实现Balance.gopackage balancetype Balancer interface { DoBalance([]*Instance, ...string) (*Instance, error)}Inst原创 2021-09-04 17:47:57 · 388 阅读 · 0 评论 -
consul集群的搭建(开发测试)
搭建consul集群参考:微服务-如何做好集群中服务器的负载均衡用consul做grpc的服务发现一、架构设计集群采取3个服务端和若干客户端的方案,客户端的数量跟具体的Ai应用数量对应,部署的时候,客户端和AI应用在同一个docker镜像二、启动三个server集群Server1 docker run --rm -d -p 8500:8500 -p8300:8300 -p8301:8301 -p8302:8302 -p8600:8600 -e CONSUL_BIND_INTERFACE='原创 2021-09-04 17:46:13 · 252 阅读 · 0 评论 -
Mac上consul的使用
consul使用一、consul是什么解决微服务中的服务的发现,识别和管理问题。具体来说:当服务上线时,服务提供者将自己的服务注册信息注册到某个专门的框架中,并通过心跳维持长链接,实时更新链接信息。服务调用者通过服务管理框架进行寻址,根据特定的算法,找到对应的服务,或者将服务的注册信息缓存到本地,这样提高性能,当服务下线时,服务管理框架会发送服务下线的通知给其他服务。常见的服务管理框架有:zookeeper,etcd,consul等**etcd:**一个高可用、分布式、一致性、key-value原创 2021-09-04 17:42:50 · 1094 阅读 · 0 评论 -
protobuffer在go中的使用
protobuffer在go中的使用一、采用go mod创建go项目mkdir protobuf-gocd protobug-gogo mod init github.com/bobwanglong/protobuf-go二、安装相关依赖go get -u github.com/golang/protobuf/protoc-gen-gotouch main.go三、创建过程# 创建src文件mkdir srccd src# 创建first文件mkdir firstcd fi原创 2021-09-04 17:40:22 · 472 阅读 · 0 评论 -
gin框架结合grpc
一、创建mkdir grpc-go-clientcd grpc-go-clientgo mod grpc-go-client# 下载并安装gingo get -u github.com/gin-gonic/gin二、创建main.go文件Main.gopackage mainimport ( "fmt" "net/http" "github.com/gin-gonic/gin")func main(){ r := gin.Default() // 测试一个get请求原创 2021-09-04 17:27:09 · 7150 阅读 · 0 评论 -
Go tool使用记录
Go tool使用记录1、tracehttps://mp.weixin.qq.com/s/ugXT_l-fNHEGANoLvirRLA示例程序package mainimport ( "os" "runtime/trace")func main() { trace.Start(os.Stderr) defer trace.Stop() var ch1 = make(chan string) go func() { ch1 <- "hello world" }()原创 2021-09-01 14:53:47 · 325 阅读 · 0 评论 -
golang开发工具总结(持续中)
golang 开发 工具原创 2021-08-25 09:43:11 · 3084 阅读 · 0 评论 -
go监听系统文件变动--fsnotify包的使用
Go 的 fsnotify 的使用简单介绍一下go中监控文件发生变动的fsnotify包的使用1、上手使用mynotify.go逻辑:使用fsnotify包创建一个“监听器”设置要监听的文件目录package mainimport ( "log" "github.com/fsnotify/fsnotify")func main() { // 创建文件/目录监听器 watcher, err := fsnotify.NewWatcher() if原创 2021-08-24 09:37:15 · 2827 阅读 · 0 评论 -
golang中的nil
结论:1、nil不是golang的关键字,可以进行赋值操作。但是不建议2、nil标识符是没有类型的,所以==对于nil来说是一种未定义的操作,不可以进行比较,而这个在python中是可以比较的,在 python 中,两个None 值永远相等3、同类型的nil比较中,指针类型nil、channel类型的nil、interface类型可以相互比较,而func类型、map类型、slice类型只能与nil标识符比较,两个类型相互比较是不合法的。4、不同类型的nil比较:指针类型和channel类型与接口类型原创 2021-08-23 10:45:21 · 1120 阅读 · 0 评论 -
Istio&&kiali安装
Istio&&kiali安装1、采用kubectl安装代码仓库:https://github.com/bobwanglong/istio克隆仓库到本地,进入istio文件夹,执行kubectl apply -f .2、安装完毕后,我们就可以通过命名空间 istio-system 来查看 Istio 是否安装成功。kubectl get all -n istio-system3、开启sidecarkubectl label ns default istio-injectio原创 2021-07-29 11:25:10 · 772 阅读 · 1 评论 -
k8s随手记
1、k8s强制删除namesapce问题描述:当一个namesapce中有资源没有删除干净的时候,使用 kubectl delete ns xxx 会出现xxxnamespace是“Teminating”状态而无法根除。解决:k8S如何强制删除namespace原创 2021-07-29 11:18:22 · 178 阅读 · 0 评论 -
golang时间戳转换
golang时间戳转换1、获取当前的时间// unix 时间fmt.Println(time.Now().Unix())// 格式化const baseFormat = "2006-01-02 15:04:05"fmt.Println(time.Now().Format(baseFormat)) 2、时间戳转换var date int64= 1257894000t := time.Unix(date, 0)fmt.Println(t.Format(baseFormat))3、时原创 2021-07-20 15:30:58 · 763 阅读 · 0 评论 -
gin框架结合zap记录项目报错的错误详情
日志的记录1、官方的方式func main() { // log gin.DisableConsoleColor() f, _ := os.Create("logs/gin.log") gin.DefaultWriter = io.MultiWriter(f,os.Stdout) r := gin.Default() r.GET("/hello",sayHi) r.GET("/bye",sayBye) err :=r.Run() if err !=nil{ log.Fatal(原创 2021-02-18 22:53:25 · 1049 阅读 · 0 评论 -
mac golang 报错runtime/cgo: macro expansion producing ‘defined‘ has undefined behavior
查看此issue解决:修改go env在env 中添加CGO_CPPFLAGS=-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-builtin-requires-header原创 2020-12-28 17:48:03 · 1091 阅读 · 0 评论 -
golang实现最短Hamilton路径算法
题目给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。输出格式输出一个整数,表示最短Hamilton路径的长原创 2020-12-14 15:55:57 · 344 阅读 · 0 评论 -
动态规划DP之整数划分golang
题干一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对109+7取模。数据范围1≤n≤1000输入样例:5输出样例:7package mainimport "fmt"//方法1//状态描述:/原创 2020-11-24 17:04:18 · 267 阅读 · 0 评论 -
golang实现prim算法,计算最小生成树
golang实现prim算法,计算最小生成树1、题目描述给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。输入格式第一行包含两个整数n和m。接下来m行原创 2020-11-12 00:18:12 · 549 阅读 · 0 评论 -
go实现Dijkstra堆优化版求单源最短路算法
##go实现题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出-1。数据范围1≤n,m≤1.5×105,图中涉及边长均不小于0,且不超过10000。输入样例:3 31 2 22 3 11原创 2020-11-05 00:32:14 · 609 阅读 · 0 评论 -
golang算法:有向图的拓扑序列
题目描述给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。输入格式第一行包含两个整数n和m接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。输出格式共一行,如果存在拓扑序列,则输出拓扑序列。否则输出-1。数据范围1≤n,m≤105输入样例:1 2原创 2020-10-29 18:38:25 · 757 阅读 · 0 评论 -
golang实现字符串哈希md
golang实现字符串哈希算法题目给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符串长度和询问次数。第二行包含一个长度为n的字符串,字符串中只包含大小写英文字母和数字。接下来m行,每行包含四个整数l1,r1,l2,r2,表示一次询问所涉及的两个区间。注意,字符串的位置从1开始编号。输出格式原创 2020-10-22 11:23:23 · 2340 阅读 · 0 评论 -
go手动实现哈希表
go手动实现哈希表原理作用哈希表的作用就是将一个较大范围或者较复杂的数据映射到一个较小的数据(0~N)哈希算法1、取模,x % y ,y一般取值为质数,并且要尽可能的离2的整次幂远,这样取值,发生冲突的概率最小2、解决冲突,通常有两种方法,拉链法和开放寻址法方法题目:维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含原创 2020-10-16 00:00:47 · 874 阅读 · 0 评论 -
go的取模运算小tips
golang的取模运算go的取模运算不同于python,而是和c++相同,如果是正数就正常操作,如果是负数的取模运算,则需要特别注意,必须(k%n+n)%nc:=2%3 //2d:=(-10%3+3)%3//2dd :=-2%3 //-2 错误原创 2020-09-27 09:59:10 · 6058 阅读 · 0 评论 -
记录go语言使用var和:= 的小区别
直接看代码func main(){var ff []intf:=[]int{}fmt.Println(ff==nil) // truefmt.Println(len(ff),cap(ff)) //0 0fmt.Println(f==nil) //falsefmt.Println(len(f),cap(f)) //0 0}输出:true0 00 0false原创 2020-09-14 11:12:15 · 424 阅读 · 0 评论 -
go的函数式选项模式
go的函数式选项模式[Functional Options Pattern in Go]前言:go语言开发遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 类似python等语言中的函数默认参数,有些对象应该使用一些基本的默认设置来开箱即用, 你偶尔可能需要提供一些更详细的配置.那么你如何创建一个函数, 用户可以指定一些额外的配置?解决方法:函数式选项模式package main// 函数式选项模式(灵活使用默认值,又不影响对元素的修改)//1、定义一个Opti原创 2020-08-07 16:39:11 · 428 阅读 · 0 评论 -
go面试3(内存对齐)
go面试3(内存对齐)版权声明: 本文为 InfoQ 作者【PONPON】的原创文章。原文链接:【https://xie.infoq.cn/article/594a7f54c639accb53796cfc7】。本文是在拜读原文后,将原文出现的面试题加入自己的思考,做了一些转变,也补充了自己一些疑惑,剩余的知识点和原理跟原文一致,原文作者的编程思想之深令人佩服,深究语言源码的精神值得学习。一、面试题type S struct { A uint8 B uint32 C int16 D i原创 2020-08-04 17:12:55 · 449 阅读 · 0 评论 -
go面试题(2)--channel
go面试题(2)–channel关于channel语法错误的是:a:var ch1 chan intb: ch2 := make(chan int,1)c: ch1 <-d: <-ch2e: close(ch1)f: m := make(map[string]chan)g: m := make(map[chan]string)解答:c,f ,g分析:选项c的目的是往chanel发送值,但是右侧却没有值,正确写法``ch1 <-10;f,g的错误是,字典的value为原创 2020-07-31 17:25:07 · 1546 阅读 · 0 评论 -
go面试练习题(1)
go面试练习题(1)下面代码输出什么func test1(x int) (func(), func()) { return func() { fmt.Println(x) x += 10 }, func() { fmt.Println(x) }}func test2(x []int) (func(), func()) { return func() { fmt.Println(x) x[0] = 0 }, func() { fmt.Println(x) }原创 2020-07-29 16:29:17 · 189 阅读 · 0 评论 -
go-web 之gin框架路由拆分与注册
go-web 之gin框架路由拆分与注册前言web开发中,所有的路由不可能写在一起,通常的做法是一个单独的routers文件或者是分布在各个app中,本问主要介绍一种,我常用的一种方式将路由拆分在app中目录结构gin_demo├── app│ ├── blog│ │ ├── handler.go│ │ └── router.go│ └── shop│ ├── handler.go│ └── router.go├── go.mod├原创 2020-07-22 15:20:13 · 1029 阅读 · 0 评论 -
gin简单上手viper配置管理
gin简单上手viper配置管理前言Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。安装go get github.com/spf13/viperviper简介Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:设置默认值从JSON、TOML、YAML、HCL、envfile和Java prope原创 2020-07-21 17:47:38 · 1696 阅读 · 0 评论 -
go借助air实现django一样的实时重载(go-web小技巧)
go借助air实现django一样的实时重载前言更详细使用请参考:https://www.liwenzhou.com/posts/Go/live_reload_with_air/上面的博文里的添加加到.bashrc或.zshrc中的操作没有执行,依然生效。Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率。实现python中的django一样的效果安装airgo get -u github.com/cosmtrek/air可以在go的bi原创 2020-07-20 17:56:56 · 451 阅读 · 0 评论 -
Go web
开始一个gin框架的web项目一、goland创建项目1、创建项目[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl1kkHvI-1595235494094)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200717111649445.png)]2、开始时的文件目录[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-duqJdOrg-159523原创 2020-07-20 16:58:53 · 255 阅读 · 0 评论 -
go的json序列化
go的json序列化前言:go语言的json序列化与反序列化借助的go语言的数据结构是 结构体(python中借助的是字典)声明一个Movie结构体type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string}一、序列化(json.Marshal或json.MarshalIndent)1、json.Marshal原创 2020-07-14 17:11:55 · 680 阅读 · 0 评论 -
go操作mongodb
go操作mongodb安装mongodb go的驱动# 使用官方的驱动包mkdir go_mongocd go_mongogo mod init go_mongogo get go.mongodb.org/mongo-driver/mongo使用1、创建客户端连接mongo数据库前提是本机安装有mongoDB数据库ctx, _ := context.WithTimeout(context.Background(),10*time.Second) client, err := mong原创 2020-06-20 23:13:24 · 434 阅读 · 0 评论 -
go调用olivere包操作elasticsearch的常用基本操作
go调用olivere包操作elasticsearch的常用基本操作完整示例代码:package mainimport ( "context" "fmt" "github.com/olivere/elastic/v7" "time")type User struct { Name string `json:"name"` Age int `json:"age"` Married bool `json:"married"` Sex str原创 2020-06-18 11:11:29 · 7725 阅读 · 5 评论 -
go操作elasticsearch
go操作elasticsearch使用第三方库https://github.com/olivere/elastic来连接ES并进行操作。下载与你的ES相同版本的client,例如我们这里使用的ES是7.2.1的版本,那么我们下载的client也要与之对应为github.com/olivere/elastic/v7。使用go.mod来管理依赖:module go_esgo 1.14require github.com/olivere/elastic/v7 v7.0.16示例:pack原创 2020-06-18 11:10:42 · 516 阅读 · 0 评论 -
golang使用nethttp的post请求发送图片
golang使用net/http的post请求发送图片发送post请求需要使用表单提交package mainimport ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "net/http" "os")func ocr_post(url string){ buf := new(bytes.Buffer) // 实例化一个结构体 writer := multipart.NewWriter(buf) // 返回一个wri原创 2020-06-03 15:43:50 · 2503 阅读 · 0 评论