Go学习
文章平均质量分 55
Go学习
.番茄炒蛋
这个作者很懒,什么都没留下…
展开
-
go语言的类型别名与类型定义
/ 类型定义: 创建一个全新类型,名为Feet,底层类型为float64// 以下赋值会导致编译错误,因为类型定义创建了全新类型,需要显示转换在这个例子中,Feet是float64的全新类型,尽管底层类型相同,但它们在类型系统中被视为不同类型.因此,不能直接进行赋值,需要进行显示类型转换.Feet类型不止是在代码中存在,在编译阶段仍然存在。原创 2023-12-09 20:44:01 · 188 阅读 · 0 评论 -
grpc-middleware实现grpc调用重试
代码】grpc-middleware实现grpc调用重试。原创 2022-07-20 22:14:17 · 402 阅读 · 0 评论 -
go集成rocketmq
go集成rocketmq发送普通消息,延时消息,事务消息,以及消费各种消息类型。原创 2022-07-16 15:03:06 · 2165 阅读 · 0 评论 -
sync.Mutex源码解读
正常的期望值应该是1000;但是由于我们没有进行加锁,goroutineA在写的同时,goroutineB也在写,同时的去读,会有两个goroutine读到一样的值,然后去执行x++,导致最后数据不正确只有983原创 2022-07-04 19:55:29 · 264 阅读 · 0 评论 -
slice扩容机制分析
go版本:go1.18.3在网上查阅的资料;扩容机制:当原slice容量(oldcap)小于256的时候,新slice(newcap)容量为原来的2倍;原slice容量超过256,新slice容量newcap = oldcap+(oldcap+3*256)/4上面的arr,它的地址是不变的,但是他执行的值是变化的,初始化时是0xc00000a098,第一次append内容会扩容所以值的地址是变化的,因为复制了内存,arr的指向新的一块内存.根据代码以及事先知道的扩容规则,可以判断扩容到512时,都是正原创 2022-06-30 19:25:25 · 689 阅读 · 0 评论 -
go-redsync分布式锁源码解析
githubrs.NewMutex(mutexname)mutex.Lock()genValue()AiUh2IuHaserskex40vH3w==这一串就是genValue()生成的,生成随机切片并进行base64编码,主要原因是为了解锁的时候,当前gorouinte加的锁不会被其它的gorouinte给删除掉,解锁的时候会对value有一个验证acquire函数做的主要的一件事,就是使用redis的setNX命令,key就是我们设置锁时使用的名称,value就是我们genValue生成的原创 2022-06-29 00:06:03 · 817 阅读 · 0 评论 -
go实现分布式锁
本文代码地址client测试开启20gorouinte去扣减123456的库存;正常情况下123456的库存应该剩余480件,但由于我们没有进行加锁,导致库存还剩485件.这种情况在真实场景下是绝对不能接受的client测试单从这次结果上看是没有什么问题,但其实还是有问题的:client测试client测试client测试...原创 2022-06-28 21:58:40 · 1650 阅读 · 3 评论 -
gorm数据库是否需要设置外键
gorm一对多官方文档设置外键的缺点代码modelmain新增日志:查询日志:结果:最后官方文档看起来很容易误导,让开发以为一对多的关系就必须要存在外键,但是我们再真实的开发环境下,大多是不会用到数据库中的物理外键的,仅仅只是做一个逻辑关联就够了.官方文档这里说的必须存在外键是我们再model里面必须要指明外键,而不是数据库中一定要有这个外键,注意: 这种情况我们就不能使用db.AutoMigrate() 来自动创建表了,因为我们再代码中指明外键,如果再使用db.AutoMi原创 2022-06-20 22:48:42 · 2956 阅读 · 0 评论 -
go集成consul测试grpc负载均衡
官方文档本文代码地址输入代码生成对应的go代码serverclient这段代码一定要import进去;只有import进去grpc-consul-resolver中consul包下的init函数才会执行,init是为了把自己的解析器注册进去;如果不import进去就获取不到对应的服务;这段代码添加的是负载均衡的策略,这里使用到的是轮询(service_config.proto);目前也只支持轮询.观察consul启动client测试负载均衡从测试结果中,12次调用两个服务各6次,原创 2022-06-15 20:46:32 · 910 阅读 · 0 评论 -
go集成consul
官方文档注册服务官方文档新注册的test-service由于本身就没有这个服务,所以服务是不健康的,30秒后会自动注销由于consul是支持http/dns接口的,内部封装其实也就是把我们的参数封装成了一个http的PUT请求去注册服务获取所有的服务官方文档提前在consul中添加了几个不需要健康检查的服务:搜索服务官方文档搜索服务和获取所有的服务其实在底层是一个接口,文档也是同一份文档,只是获取所有的服务中没有传参而已.具体的返回值:这段代码传的参数是一个具体的表达式,是用于用于在原创 2022-06-13 21:46:14 · 479 阅读 · 0 评论 -
go基于腾讯云实现发送短信
腾讯云短信服务返回的response:原创 2022-06-12 10:53:12 · 884 阅读 · 0 评论 -
go基于阿里云实现发送短信
阿里云短信服务原创 2022-06-12 10:21:40 · 1213 阅读 · 0 评论 -
gin集成图形验证码
github文档content就是文件内容,需要进行解码才能看到图片,点击解码输入正确的验证码,就会返回true,二次验证或者输入错误的验证码都会返回false原创 2022-06-11 18:42:12 · 785 阅读 · 0 评论 -
gin解决跨域问题
再非简单请求且跨域的情况下,浏览器会发送OPTIONS预检请求.Preflighted Requests是CORS中一种透明服务器验证机制.预检请求首先需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,其目的就是为了判断实际发送的请求是安全的.简单请求需满足以下两个条件非简单请求即是复杂请求常见的复杂请求有:再跨域的情况下,非简单请求会先发起一次空body的OPTIONS请求,称为"预检"请求,用于向服务器请求权限信息,等预检请求被成功响应后,才会发起真正的http请求.浏览器的预检请求原创 2022-06-11 17:21:24 · 6168 阅读 · 0 评论 -
go配置文件管理-viper
go配置文件管理-viper原创 2022-06-09 22:25:50 · 530 阅读 · 1 评论 -
go语言time.Format的坑
go语言time.Format的坑原创 2022-06-08 21:53:53 · 1011 阅读 · 1 评论 -
go语言使用MD5
MD5全称Message Digest Algorithm 5(信息摘要算法)我们使用MD5进行加密的值,可以在网上随便的被解密;这种做法并不是对MD5进行反解得到的,而是暴力破解;大概的原理就是事现将一些常见的密码进行MD5然后将明文与MD5储存到数据库中表中,这张表叫彩虹表;等到我们进行解密的时候再进行反向查询.并不能说明MD5不具备不可逆性;为了应对上面所说的场景;我们可以使用盐值加密:go-password-encoder再次进行解密时已经解密不出来明文了,即使能解密出来明文,那也是我们原创 2022-06-05 16:41:42 · 2183 阅读 · 0 评论 -
linux下搭建go开发环境
下载wget https://dl.google.com/go/go1.18.1.linux-amd64.tar.gz解压 tar -xvf go1.18.1.linux-amd64.tar.gz配置环境变量vim ~/.bashrcexport GOROOT=/root/goexport GOPATH=/root/projectsexport PATH=$PATH:$GOROOT/bin:$GPPATH/binsource ~/.bashrc设置代理加速go env -w原创 2022-05-10 20:20:07 · 174 阅读 · 0 评论 -
go语言实现腾讯云对象存储
简介对象存储Go SDK安装cos Go SDK:go get -u github.com/tencentyun/cos-go-sdk-v5预签名实现查看func main() { u, err := url.Parse("") //自己桶的地址 if err != nil { panic(err) } // 用于Get Service 查询,默认全地域 service.cos.myqcloud.com su, err := url.Parse("https://cos.C原创 2022-04-12 23:04:09 · 1022 阅读 · 0 评论 -
go+JWT运用
JWT简介JWT简介生成RSA密钥地址生成tokenjwt.gopackage tokenimport ( "crypto/rsa" "github.com/dgrijalva/jwt-go" "time")type JWTTokenGen struct { privateKey *rsa.PrivateKey Issue string nowFunc func() time.Time}func NewJWTTokenGen(issuer string,原创 2022-03-27 17:30:14 · 1367 阅读 · 0 评论 -
go操作Docker
Docker介绍Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口.go操作Dockerpackage mainimport ( "context" "fmt" "github.com/docker/cli/cli/connhelper" "github.com/docker/docker/api/types" "g原创 2022-03-27 00:39:10 · 1951 阅读 · 0 评论 -
go操作MongoDB
MongoDB介绍MongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的MongoDB中将一条数据储存为一个文档(document),数据结构由键值对(K-V)组成,其中文档类似于平常使用到的JSON对象,文档中的字段值可以包含其他文档,数组,及文档数组insertpackage mainimport ( "context" "fmt" "go.mongodb.org/mongo-drive原创 2022-03-26 20:40:14 · 2961 阅读 · 0 评论 -
gRPC-Gateway实现
简介gRPC-Gateway是protoc的插件.它读取gRPC服务定义并生成反向代理服务器,将 RESTful JSON API转换为gRPC.此服务器是根据你的gRPC定义中的自定义选项生成的.gRPC-Gateway可帮助你同时提供gRPC和RESTful风格的API.GitHub地址;文档地址实现编写yaml文件type: google.api.Servicecofig_version: 3http: rules: - selector: carcool.TripS原创 2022-03-21 23:48:38 · 983 阅读 · 2 评论 -
ProtoBuf go初体验
编译器的安装protobuf是Google用于序列化结构化数据的语言中立,平台中立,可扩展机制.是一种语言无关,平台无关,可扩展的序列化结构偶数据的方法.是一种灵活,高效,自动化机制的结果数据序列化方法-可类比XML,但是比XML更小,更快,更简单,你可以直接定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据.你深圳可以更新数据结构.而不破坏由旧数据结构编译的已部署程序.扩展性兼容性良好protobufGitHub地址在里面选择releases页面选原创 2022-03-20 14:13:42 · 799 阅读 · 0 评论 -
go基于阿里云实现中文分词
API介绍由于阿里云服务SDK方式调用只提供了JAVA和Python,用go就只能使用普通HTTP请求调用阿里云NLP基础服务API概览获取AccessKey中文分词(基础版)API公共参数每个接口都需要使用的请求参数(公共参数概览);公共参数大多参数都给了对应的取值.唯一一个Signature(签名结果串)比较复杂(签名机制),其他的参数全部都拼接到地址后面就可以了代码package mainimport ( "crypto/hmac" "crypto/sha1" "enc原创 2022-03-17 19:31:11 · 1516 阅读 · 0 评论 -
go对Json的处理
目前再前后端传递数据的方式最广泛的引用使用到的就是Json的数据格式;go语言对Json也有一个非常良好的支持Marshal生成Jsonpackage mainimport ( "encoding/json" "fmt")type Order struct { ID string Name string Quantity int TotalPrice float64}func main() { o := Order{ ID: "123456", Name: .原创 2022-03-16 21:45:07 · 2345 阅读 · 2 评论 -
go语言实现走出迷宫
问题如图;给定一个[m][n]int矩形迷宫,每个元素上面是0或者1;0表示此路可过;1表示此路不能过;每次只能上下左右的走一格.给定一个start起点和end终点,记录从start最少走多少步可以走到end,如果走不通返回-1(给定的start和end不会有索引越界的情况)思路初始化一个与参数矩形长度一样的[][]int steps用来记录当前节点我们是否走过.在创建一个我们准备开始走的节点数组.将start加入到里面;循环的开始上下左右的走,走到的节点如果越界或者已经走过或者这个节点不允许走就跳原创 2022-03-15 23:12:51 · 248 阅读 · 0 评论 -
go并发模式
所谓的并发模式并不像设计模式一样是一个普遍的标准,只是前人总结出的经验生成器package mainimport ( "fmt" "math/rand" "time")func msgGen(serviceName string) chan string { c := make(chan string) go func() { i := 0 for { time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisec.原创 2022-03-14 23:07:22 · 557 阅读 · 1 评论 -
传统的同步机制
分类WaitGroupMutexCondWaitGrouppackage mainimport ( "fmt" "sync")func main() { waitGroupDemo()}func waitGroupDemo() { var channels [10] chan int var wg sync.WaitGroup for i := 0; i < 10; i++ { channels[i] = make(chan int) go doWor原创 2022-03-13 23:39:17 · 208 阅读 · 0 评论 -
使用Select进行调度
非阻塞式获取package mainimport ( "fmt" "math/rand" "time")func main() { var c1, c2 chan int for { select { case n := <-c1: fmt.Println("Received from c1:", n) case n := <-c2: fmt.Println("Received from c2:", n) default: fmt.Prin原创 2022-03-13 22:47:58 · 558 阅读 · 0 评论 -
使用channel等待任务结束
加一个chan通知发送方package mainimport "fmt"func main() { chanDemo()}func chanDemo() { var workers [10]worker for i := 0; i < 10; i++ { workers[i] = createWorker(i) } for i := range workers { workers[i].in <- 'a' + i <-workers[i].done原创 2022-03-13 18:38:07 · 425 阅读 · 0 评论 -
Go学习:channel
概念goroutine与goroutine之间的双向通道就是channel语法定义package mainimport "fmt"func chanDemmo() { c := make(chan int) c <- 1 c <- 2 n := <-c fmt.Println(n)}func main() { chanDemmo()}运行程序,会出现死锁;channel是goroutine与goroutine之间的交互,如果没有gorout原创 2022-03-13 15:23:13 · 376 阅读 · 0 评论 -
Go学习:协程和调度器
协程go func() {}()go语言对并发编程有一个原生的支持,这个再通用型语言里面是不常见的.package mainimport "fmt"func main() { for i := 0; i < 10; i++ { go func(i int) { for{ fmt.Printf("Hello from goroutine %d\n", i) } }(i) }}控制台什么都没有打印直接退出了;匿名函数加上go;就不是说再main里原创 2022-03-13 11:52:29 · 506 阅读 · 0 评论 -
Go学习:生成文档和实例代码
文档package queuetype Queue []intfunc (queue *Queue) Push(val int) { *queue = append(*queue, val)}func (queue *Queue) Pop() int { popVal := (*queue)[0] *queue = (*queue)[1:] return popVal}func (queue *Queue) IsEmpty() bool { return len(*queue原创 2022-03-12 23:20:21 · 1098 阅读 · 0 评论 -
Go学习:测试http服务器
代码package filelistingimport ( "fmt" "io/ioutil" "net/http" "os" "strings")const prefix = "/list/"type userError stringfunc (e userError) Error() string { return e.Message()}func (e userError) Message() string { return string(e)}func原创 2022-03-12 19:20:19 · 471 阅读 · 0 评论 -
Go学习:pprof性能调优
调优前代码package main/**无重复字符的最长字串;支持中文*/func lengthOfNonRepratingSubStr(s string) int { lastOccurred := make(map[rune]int) start := 0 maxLen := 0 for i, ch := range []rune(s) { if lastIndex, ok := lastOccurred[ch]; ok && lastIndex >= s原创 2022-03-12 12:34:21 · 1226 阅读 · 0 评论 -
Go学习:测试
对于测试有一句比较有名的口号:Debugging Sucks! Testing Rocks! 我们希望我们的程序,多做测试而不是多做调试;我们能否写出一个好的测试,对于一个成功的开发非常重要.同样对于一门语言也非常的重要,因此go语言再测试方面还是有自己的见解的传统测试 VS 表格驱动测试传统测试 // 要被测试的方法 public int add(int a, int b) { return a + .原创 2022-03-11 23:15:00 · 310 阅读 · 0 评论 -
Go学习:错误的处理
不对错误进行处理package mainimport ( "bufio" "fmt" "learngo/errhandling/fib" "os")func writeFlie(fileName string) { file, err := os.OpenFile( fileName, os.O_EXCL|os.O_CREATE, 0666) if err != nil { panic(err) } defer file.Close() writer := bufio原创 2022-03-09 22:50:34 · 267 阅读 · 0 评论 -
Go学习:defer
defer的概念defer调用再函数结束时发生,具体概念可以直接百度或者google详细搜索详细,这里主要是通过几个实例来对defer进行详解.defer实例实例1package mainimport "fmt"func tryDefer() { defer fmt.Println(1) fmt.Println(2)}func main() { // 2 // 1 tryDefer()}实例2package mainimport "fmt"func try原创 2022-03-09 20:48:54 · 192 阅读 · 0 评论 -
Go学习:函数式编程
函数式编程VS函数指针函数是一等公民:参数,变量,返回值都可以是函数高阶函数:函数的参数还可以是函数函数->闭包"正统"函数式编程不可变性:不能有状态,只有常量和函数函数只能有一个参数go语言是一个通用的语言,它不会再正统函数式编程做过多的文章package mainimport "fmt"type iAdder func(int) (int, iAdder)func adderi(base int) iAdder { return func(i int) (in原创 2022-03-08 23:23:43 · 1457 阅读 · 1 评论