Go
JackMa_
每个优秀的人,都有一段沉默的时光,那段时光,是付出了很多努力,却得不到结果的日子,我们把它叫做扎根。
展开
-
微服务权鉴 - Zanzibar
从开发人员的角度来看,Zanzibar 就是一个 API 而已,您可以将用户和数据关系托管给它,然后可以通过访问点做出快速、准确地权限决策。例如,当新用户注册时,您告知 Zanzibar。当该用户创建受保护的资源(例如文档、视频或银行帐户)时,您会告知 Zanzibar。当该用户与其他用户共享资源或创建相关资源时,您告知 Zanzibar。最后,在需要回答“X 是否允许 读取/写入/删除/更新 Y?”这个问题时,Zanzibar 已经具备了快速回答该问题所需的所有信息。转载 2023-02-28 23:11:48 · 876 阅读 · 0 评论 -
Go 语言实现的可读性更高的并发神库
花了小半天时间看了一下这个库,很多设计点值得我们学习,总结一下我学习到的知识点:conc.WatiGroup对Sync.WaitGroup进行了封装,对Add、Done、Recover进行了封装,提高了可读性,避免了冗余代码ForEach、Map方法可以更优雅的并发处理切片,代码简洁易读,在实现上Iterator中的并发处理使用atomic来控制只创建一个闭包,避免了GC性能问题。转载 2023-02-28 22:06:54 · 375 阅读 · 0 评论 -
Golang中的深拷贝与浅拷贝
一、概念1、深拷贝(Deep Copy)拷贝的是数据本身,创造一个样的新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值。既然内存地址不同,释放内存地址时,可分别释放。值类型的数据,默认全部都是深复制,Array、Int、String、Struct、Float,Bool。2、浅拷贝(Shallow Copy)拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化。释放内转载 2022-05-22 22:35:53 · 10308 阅读 · 0 评论 -
Go使用标准库net/http发送Post请求
发送Post请求net/http发送Post请求很容易,下面的代码我们和Get请求一样,把响应的内容的信息打印出来了,细心的朋友可能会发现,在参数传递、和结果解析时用了三种不同的方式,我们将在后面进行解析。示例代码package mainimport ( "bytes" "fmt" "io/ioutil" "net/http" "reflect" "strings")func main() { resp, err := http.Post("http://httpbin转载 2022-04-10 15:37:53 · 2065 阅读 · 0 评论 -
Go使用标准库net/http发送Get请求
发送Get请求使用Golang发送get请求很容易,我们还是使用http://httpbin.org作为服务端来进行演示。package mainimport ( "bytes" "fmt" "log" "net/http" "net/url" "reflect")func main() { resp, err := http.Get("http://httpbin.org/get?name=Detector") if err != nil { log.Printl转载 2022-04-10 15:36:40 · 1438 阅读 · 0 评论 -
Go中struct转map的三种方式
struct转map使用json模块直接使用json.Marshal方法来强制转化struct。参考代码:func JSONMethod(content interface{}) map[string]interface{} { var name map[string]interface{} if marshalContent, err := json.Marshal(content); err != nil { fmt.Println(err) } else { d :=转载 2022-04-10 15:15:01 · 6221 阅读 · 0 评论 -
Go 语言里怎么正确实现枚举?答案藏着官方的源码里
在编程领域里,枚举是用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。在刚开始学编程的时候,你一定写过,至少见过直接使用魔术数字进行判断的代码。啥叫魔术数字呢,举个例子,要置顶一个文章的时候先判断文章是不是已发布状态。if (article.state == 2) { // state 2 代表文章已发布}假如我们的代码里没有注释,或者等我们项目的代码里充斥着这些魔术数字转载 2022-04-10 14:58:26 · 482 阅读 · 1 评论 -
Go编码JSON时忽略掉指定字段
并不是所有数据我们都期望编码到 JSON中暴露给外部接口的,所以针对一些敏感的字段我们往往希望将其从编码后的 JSON数据中忽略掉。那么上面也说了只有导出的结构体成员才会被编码,有的同学会问我直接用小写的字段名不行吗?可是为了未导出字段只能在包内访问,像这种携带内部敏感数据的往往都是应用的基础数据,由项目的公共包来提供的。那么怎么技能维持字段的导出性又能让其在 JSON数据中被忽略掉呢? 还是使用结构体的标签进行注解,比如下面定义的结构体,可以把身份证 IdCard字段在 JSON数据中去掉:type原创 2022-04-10 14:51:17 · 2622 阅读 · 0 评论 -
Go解决空切片在JSON里被编码成null
因为切片的零值为 nil,无指向内存的地址,所以当以这种形式定义 varf[]int初始化 slice后,在JSON中将其编码为 null,如果想在 JSON 中将空 slice 编码为 []则需用make初始化 slice为其分配内存地址:运行下面的例子可以看出两点的区别:var f1 []stringf2 := make([]string, 0)json1, _ := json.Marshal(Person{f1})json2, _ := json.Marshal(Person{f2}原创 2022-04-10 14:50:38 · 3420 阅读 · 0 评论 -
Go自定义JSON键名
我们先从最常见的一个问题说,首先在Go 程序中要将数据编码成JSON 格式时通常我们会先定义结构体类型,将数据存放到结构体变量中。 type Address struct { Type string City string Country string } type CreditCard struct { FirstName string LastName string Addres原创 2022-04-10 14:41:50 · 563 阅读 · 0 评论 -
Go接口定义与实现
package interfacetype Programmer interface{ WriteHelloWorld() string}type GoProgrammer struct{}func (go *GoProgrammer) WriteHelloWorld() string { return "fmt.Println(\"Hello World\")"}func TestClient(t *testing.T) { var p Programmer.原创 2022-03-26 16:27:27 · 1068 阅读 · 0 评论 -
Go语言统计函数运行时长
func timeSpend(inner func(op int) int) func(op int) int { return func(n int) int { start := time.Now() ret := inner(n) fmt.Println("time spend:", time.Since(start).Seconds()) return ret }}原创 2022-03-26 15:51:15 · 564 阅读 · 0 评论 -
Go语言之共享内存并发机制示例
func main() { var mut sync.Mutex var wg sync.WaitGroup counter := 0 for i := 0; i < 5000; i++ { wg.Add(1) go func() { defer func() { mut.Unlock() }() mut.Lock() counter++ wg.Done() }() } wg.Wait() t.Logf("count = %d",.原创 2022-03-17 22:41:30 · 552 阅读 · 0 评论 -
几种性能测试工具的总结
我们经常会谈论性能、并发等问题,但是衡量性能不是说写段代码循环几百次这么简单。最近从项目上的同事了解到了代码化的测试性能测试工具 k6,以及结合之前用过的Java 微基准测试 (JMH)、AB (Apache Benchmark) 测试、Jmeter 做一下总结。谈性能,实际上结合实际的业务背景、网络条件、测试数据的选择等因素影响非常大,单纯的谈 QPS 等数据意义不大。这里介绍的几个工具刚好能满足平时开发工作中不同场景下衡量性能的需求,因此整理出来。Java 微基准测试 (JMH) 可以用.转载 2022-03-06 17:08:13 · 847 阅读 · 0 评论 -
【Go面试】Go面试题总结
Go面试题总结原创 2022-03-05 23:31:34 · 1454 阅读 · 0 评论 -
Go语言中比较字符串比较的几种方法
在go语言中比较字符串相等的方式有如下三种:== 直接比较,区分大小写 strings.Compare(a,b) 该函数返回值为int, 0 表示两数相等,1 表示a>b, -1 表示a<b。 区分大小写 strings.EqualFold(a,b) 直接返回是否相等,不区分大小写。...原创 2022-03-05 15:56:21 · 3836 阅读 · 0 评论 -
go语言中获取变量类型的三种方法
package mainimport ( "fmt" "reflect")func main() { var num float64 = 3.14 // 方法1: println(reflect.TypeOf(num).Name()) // 方法2: fmt.Println(reflect.TypeOf(num)) // 方法3: fmt.Printf(`%T`, num)}...原创 2022-02-23 20:30:06 · 3414 阅读 · 1 评论 -
“The selected directory is not a valid home for Go SDK” Goland报错处理
使用g升级golang版本到1.17.*的时候goland无法配置sdk,报错如下The selected directory is not a valid home for Go SDK检查环境配置无误解决办法1.执行go version 找到自己安装的详细版本2.编辑%G_HOME%/version/1.17.7/src/runtime/internal/sys/zversion.go文件(如果没使用g控制go版本也就是自己安装的编辑%GOROOT%/src/runtime/i原创 2022-02-20 23:48:36 · 1087 阅读 · 0 评论 -
Windows下使用g进行go版本管理
g 实现的功能支持列出可供安装的go版本号 支持列出已安装的go版本号 支持在本地安装多个go版本 支持卸载已安装的go版本 支持在已安装的go版本之间自由切换下载在官方 github 上下载 releases 版本:https://github.com/voidint/g/releases 官方 readme 中提供了 linux 和 mac 下的下载安装教程,win 下稍有不同 g 默认将 go 下载在系统盘,如果你希望自定义安装 go 的位置,则下载 1.2.1 版本,并进行原创 2022-02-20 23:39:15 · 1069 阅读 · 0 评论 -
Go:基于 MongoDB 构建 REST API — Fiber 版
1、准备工作开始之前,先要准备好 MongoDB。这里我们不自己安装 MongoDB,而是使用云。Mongo 提供了免费使用的。配置 MongoDB如果没有 MongoDB 账号,先注册一个:https://www.mongodb.com/zh-cn/cloud/atlas/register。有账号直接登录即可。然后新建一个项目(project):New Project项目名称你可以取一个你喜欢的名字,比如 golang-api,然后 Next:enter project n转载 2022-02-11 20:11:48 · 580 阅读 · 0 评论 -
Go:10 个与众不同的特性
Go作为一门相对较新的语言,能够脱颖而出,肯定是多方面的原因。本文聊聊它不同于其他语言的 10 个特性。Go 的创建者Robert Griesemer[1]、Rob Pike[2]和Ken Thompson[3]在 Google 工作,在那里,大规模扩展的挑战激发了他们将 Go 设计为具有大型代码库的项目的快速高效的编程解决方案,由多个开发人员管理,具有严格的性能要求,并跨越多个网络和处理核心。Go 的创始人在创建新语言时也抓住了这个机会,从其他编程语言的优势,劣势和疏忽中学习。结果是一...转载 2022-01-16 17:18:47 · 456 阅读 · 0 评论 -
Go语言使用对象池缓冲难以创建可复用的对象示例
obj_pool.go:package obj_poolimport ( "errors" "time")type ReusableObj struct {}type ObjPool struct { bufChan chan *ReusableObj // 用于缓冲可重用对象}func NewObjPool(numOfObj int) *ObjPool { objPool := ObjPool{} objPool.bufChan = make(chan *Reus.原创 2021-08-18 22:42:32 · 254 阅读 · 0 评论 -
Go语言共享内存并发简单示例
func main() { var mut sync.Mutex var wg sync.WaitGroup counter := 0 for i := 0; i < 5000; i++ { wg.Add(1) go func() { defer func() { mut.Unlock() }() mut.Lock() counter++ wg.Done() }() } wg.Wait() t.Logf("count = %d",.原创 2021-08-15 21:30:23 · 368 阅读 · 1 评论 -
go build报错,提示错误can‘t load package: package xxx is not in GOROOT (D:\Go\Go\src\xxx)
环境是windows,ide是goland,我运行的是一个测试文件,报错是文章标题问题原因及解决办法我们都知道GO管理包的方式有两种,传统的GOPATH模式和目前流行的GOMOD,主要是我一开始对这两种方式不是很了解,只知道自己要编译的项目是在go mod下形式下编译的,也不知道深层次的原因是什么,网上有很多关于两者的区别和详细的介绍,本文在此不做赘述。直接进入src下xxx目录执行下边命令初始化gomod即可go mod init再build就可通过了。...原创 2021-08-15 10:15:35 · 2473 阅读 · 0 评论 -
Go语言之特性
从开发者的角度来看,go语言有很多让开发人员喜欢的特性。第一较之C语言的37个关键字,PHP的68个关键字,C++11多大84个关键字,Go语言只有区区25个关键字另外特别是对于一些特别复杂的任务,比如说并发编程、内存管理,Go语言都有内置的并发支持以及垃圾回收机制。第二呢当然是高效,Go语言作为一种编译的静态语言类型语言,尽管支持垃圾回收机制,但是你仍然可以使用指针去直接访问内存。第三是生产力,Go语言有简介清晰的依赖管理,以及独特的接口类型设计,甚至对一些编程方式的约束,比如支持复合而不支持原创 2021-08-14 11:59:22 · 214 阅读 · 0 评论 -
Go语言学习之Go特性(一)
从开发者的角度来看,go语言有很多让开发人员喜欢的特性。第一较之C语言的37个关键字,PHP的68个关键字,C++11多大84个关键字,Go语言只有区区25个关键字另外特别是对于一些特别复杂的任务,比如说并发编程、内存管理,Go语言都有内置的并发支持以及垃圾回收机制。第二呢当然是高效,Go语言作为一种编译的静态语言类型语言,尽管支持垃圾回收机制,但是你仍然可以使用指针去直接访问内存。第三是生产力,Go语言有简介清晰的依赖管理,以及独特的接口类型设计,甚至对一些编程方式的约束,比如支持复合而不支持原创 2022-03-17 22:42:06 · 249 阅读 · 0 评论 -
基于go通道实现斐波那契数列
package mainimport ( "fmt")func fibonacci(n int, c chan int) { x, y := 0, 1 for i := 0; i < n; i++ { c <- x x, y = y, x+y } close(c)}func main() { c := make(chan.原创 2021-08-05 23:23:58 · 212 阅读 · 0 评论 -
基于go实现斐波那契数列
package mainimport "fmt"func fibonacci(n int) int { if n < 2 { return n } return fibonacci(n-2) + fibonacci(n-1)}func main() { var i int for i = 0; i < 10; i++ { fmt.Printf("%d\t", fibonacci(i)) }}原创 2021-08-05 22:51:03 · 176 阅读 · 0 评论 -
基于go实现简单的HashMap
package mainimport ( "fmt")type HashMap struct { key string value string hashCode int next *HashMap}var table [16](*HashMap)func initTable() { for i := range table{ table[i] = &HashMap{"","",i,nil} }}fu.原创 2021-08-05 22:47:59 · 386 阅读 · 0 评论 -
Go语言文件读取的一些总结
Go语言在进行文件操作的时候,可以有多种方法。最常见的比如直接对文件本身进行Read和Write; 除此之外,还可以使用bufio库的流式处理以及分片式处理;如果文件较小,使用ioutil也不失为一种方法。面对这么多的文件处理的方式,那么初学者可能就会有困惑:我到底该用那种?它们之间有什么区别?笔者试着从文件读取来对go语言的几种文件处理方式进行分析。os.File、bufio、ioutil比较效率测试文件的读取效率是所有开发者都会关心的话题,尤其是当文件特别大的时候。为了尽可能的展示这三者转载 2020-08-25 21:46:30 · 870 阅读 · 0 评论 -
Go实现算法:斐波那契数列fibonacci
package mainimport "fmt"func fibonacci(n int) int { if n < 2 { return n } return fibonacci(n-2) + fibonacci(n-1)}func main() { var i int for i = 0; i < 10; i++ { fmt.Printf("%d\t", fibonacci(i)) }}结果如下:0 .原创 2020-08-19 10:45:34 · 826 阅读 · 1 评论 -
Go实现算法:N的阶乘
package mainimport "fmt"func Factorial(n uint64)(result uint64) { if (n > 0) { result = n * Factorial(n-1) return result } return 1}func main() { var i int = 15 fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64.原创 2020-08-19 10:41:55 · 2297 阅读 · 0 评论 -
Go算法筛选100以内的数字是否是素数
package mainimport "fmt"func main() { var i, j int for i = 2; i < 100; i++ { for j = 2; j <= (i / j); j++ { if i%j == 0 { break } } if j > (i / j) { fmt.Prin.原创 2020-08-18 11:23:18 · 297 阅读 · 0 评论