go
文章平均质量分 78
罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目。
ghostwritten
关注领域:go python k8s docker 数据库 运维
打造一个专属个人更精准的问题解决搜索引擎。
展开
-
go基础入门快速学习手册
go语言入门安装与hello worldgopath、goroot详解go 基本类型介绍go常量详解go变量详解go指针详解go流程控制详解go方法详解go array数组详解goslice切片引用类型详解原创 2021-01-14 16:00:44 · 617 阅读 · 0 评论 -
项目管理:如何编写高质量的Makefile?
在上面的 Makefile 组织方式中,根目录下的 Makefile 聚合了项目所有的管理功能,这些管理功能通过 Makefile 伪目标的方式实现。做完这些,你的编写前准备工作就基本完成了。这就需要你整理好 Makefile 当前要实现的功能、即将要实现的功能和未来可能会实现的功能,然后基于这些功能,利用 Makefile 编程技巧,编写可扩展的 Makefile。最后,在编写过程中,你还需要掌握一些 Makefile 的编写技巧,这些技巧可以使你编写的 Makefile 扩展性更强,功能更强大。原创 2023-01-28 17:31:12 · 543 阅读 · 0 评论 -
go 库 Cobra 现代化的命令行框架
Cobra既是一个可以创建强大的现代 CLI 应用程序的库,也是一个可以生成应用和命令文件的程序。有许多大型项目都是用 Cobra 来构建应用程序的,例如Kubernetes、Docker、etcd、Rkt、Hugo等。Cobra 建立在commands、arguments 和 flags 结构之上。commands 代表命令,arguments 代表非选项参数,flags 代表选项参数(也叫标志)。一个好的应用程序应该是易懂的,用户可以清晰地知道如何去使用这个应用程序。或者。原创 2022-12-28 10:50:54 · 629 阅读 · 0 评论 -
Go 包 os 文件操作
1 os介绍Go 在 os 中提供了文件的基本操作,包括通常意义的打开、创建、读写等操作,除此以外为了追求便捷以及性能上,Go 还在 io/ioutil 以及 bufio 提供一些其他函数供开发者使用2 练习2.1 环境变量2.1.1 获取所有环境变量, 返回变量列表func Environ() []stringpackage main import ( "fmt" ...原创 2020-04-02 21:06:42 · 2483 阅读 · 1 评论 -
Go 包 fmt 打印输出
格式化输出函数func Print(a ...interface{}) (n int, err error)Print采用默认格式将其参数格式化并写入标准输出。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格,返回写入的字节数和遇到的任何错误。func Printf(format string, a ...interface{}) (n int, err error)Prin...原创 2020-02-25 22:51:43 · 1303 阅读 · 1 评论 -
Go 库 pflag 命令行参数解析
pflag简介pflag是Go的flag包的直接替代,实现了POSIX / GNU样式的–flags。pflag是Go的本机标志包的直接替代。如果您在名称“ flag”下导入pflag,则所有代码应继续运行且无需更改。github:https://github.com/spf13/pflag源码包:https://godoc.org/github.com/spf13/pflag#Args默...原创 2020-05-06 23:31:09 · 2951 阅读 · 2 评论 -
go 库 viper 配置解析神器
几乎所有的后端服务,都需要一些配置项来配置我们的服务,一些小型的项目,配置不是很多,可以选择只通过命令行参数来传递配置。但是大型项目配置很多,通过命令行参数传递就变得很麻烦,不好维护。标准的解决方案是将这些配置信息保存在配置文件中,由程序启动时加载和解析。Go 生态中有很多包可以加载并解析配置文件,目前最受欢迎的是 Viper 包。Viper 是 Go 应用程序现代化的、完整的解决方案,能够处理不同格式的配置文件,让我们在构建现代应用程序时,不必担心配置文件格式。原创 2022-12-20 15:21:21 · 788 阅读 · 0 评论 -
go 如何设计日志包并记录日志?
不同的运行环境,需要不同的日志输出配置,例如:开发测试环境为了能够方便地 Debug,需要设置日志级别为 Debug 级别;现网环境为了提高应用程序的性能,则需要设置日志级别为 Info 级别。又比如,现网环境为了方便日志采集,通常会输出JSON格式的日志;开发测试环境为了方便查看日志,会输出TEXT格式的日志。所以,我们的日志包需要能够被配置,还要不同环境采用不同的配置。通过配置,可以在不重新编译代码的情况下,改变记录日志的行为。支持输出到标准输出和文件。转载 2022-12-18 22:46:38 · 938 阅读 · 2 评论 -
怎么写出优雅的 Go 项目?
如何写出一个优雅的 Go 项目呢?为什么是 Go 项目,而不是 Go 应用?一个优雅的 Go 项目具有哪些特点?先来看第一个问题。Go 项目是一个偏工程化的概念,不仅包含了 Go 应用,还包含了项目管理和项目文档:这就来到了第二个问题,一个优雅的 Go 项目,不仅要求我们的 Go 应用是优雅的,还要确保我们的项目管理和文档也是优雅的。符合 Go 编码规范和最佳实践;易阅读、易理解,易维护;易测试、易扩展;代码质量高。转载 2022-11-28 21:05:19 · 486 阅读 · 0 评论 -
如何管理应用的生命周期?
那应用的生命周期管理,怎么理解呢?其实,就是指采用一些好的工具或方法在应用的整个生命周期中对应用进行管理,以提高应用的研发效率和质量。那么,如何设计一套优秀的应用生命周期管理手段呢?这就跟研发流程“设计”的思路一样,你可以自己设计,也可以采用业界沉淀下来的优秀管理手段。同样地,我更建议你采用已有的最佳实践,因为重复造轮子、造一个好轮子太难了。我们可以从两个维度来理解应用生命周期管理技术。第一个维度是演进维度。应用生命周期,最开始主要是通过研发模式来管理的,按时间线先后出现了瀑布模式、迭代模式、转载 2022-11-25 18:37:25 · 738 阅读 · 0 评论 -
如何设计 Go 项目的开发流程?
在开发 Go 项目时,掌握项目的研发流程很重要。掌握研发流程,会让项目研发对我们更加白盒,并且有利于我们制定详细的工作任务。那么如何设计项目研发流程呢?你可以根据需要自行设计。自行设计时有些点是一定要关注的,例如我们的流程需要支持高的发布效率和发布质量,支持快速迭代,流程是合理、可扩展的,等等。如果你不想自己设计,我介绍了一套相对通用、标准的研发流程,如果合适可以直接拿来作为自己设计的研发流程。这套研发流程包含 6 个阶段:需求阶段、设计阶段、开发阶段、测试阶段、发布阶段和运营阶段。转载 2022-11-23 15:39:34 · 732 阅读 · 0 评论 -
工作流设计:如何设计合理的多人开发模式?
一个企业级项目是由多人合作完成的,不同开发者在本地开发完代码之后,可能提交到同一个代码仓库,同一个开发者也可能同时开发几个功能特性。这种多人合作开发、多功能并行开发的特性如果处理不好,就会带来诸如丢失代码、合错代码、代码冲突等问题。在使用 Git 开发时,有 4 种常用的工作流,也叫开发模式,按演进顺序分为集中式工作流、功能分支工作流、Git Flow 工作流和Forking 工作流。接下来,我会按演进顺序分别介绍这 4 种工作流。这一讲中,我基于 Git 向你介绍了 4 种开发模式,现在跟我回顾一下吧。转载 2022-11-17 18:24:07 · 425 阅读 · 0 评论 -
目录结构设计:如何组织一个可维护、可扩展的代码目录?
遵循一个好的目录规范,把代码目录设计得可维护、可扩展,甚至比文档规范、Commit 规范来得更加重要。天我们主要学习了怎么设计代码的目录结构。先讲了目录结构的设计思路:在设计目录结构时,要确保目录名是清晰的,功能是明确的,并且设计的目录结构是可扩展的。然后,我们一起学习了 2 种具体的目录结构:结构化目录结构和平铺式目录结构。结构化目录结构比较适合 Go 应用,平铺式目录结构比较适合框架 / 库。因为这 2 种目录结构组织比较合理,可以把它们作为目录规范来使用。转载 2022-11-15 00:33:48 · 894 阅读 · 1 评论 -
项目开发 规范设计:commit 如何更加规范?
git rebase 的最大作用是它可以重写历史。我们通常会通过使用 git rebase 命令,-i 参数表示交互(interactive),该命令会进入到一个交互界面中,其实就是 Vim 编辑器。在该界面中,我们可以对里面的 commit 做一些操作,交互界面如图所示:这个交互界面会首先列出给定之前(不包括,越下面越新)的所有 commit,每个 commit 前面有一个操作命令,默认是pick。转载 2022-11-11 17:41:10 · 164 阅读 · 0 评论 -
centos 8.2 配置 go 项目开发环境
我们一起安装和配置了一个 Go 开发环境原创 2022-11-02 16:18:20 · 650 阅读 · 1 评论 -
Go Mutex 【3】--易错点
上一讲,我带你一起领略了 Mutex 的架构演进之美,现在我们已经清楚 Mutex 的实现细节了。当前 Mutex 的实现貌似非常复杂,其实主要还是针对饥饿模式和公平性问题,做了一些额外处理。但是,我们在第一讲中已经体验过了,Mutex 使用起来还是非常简单的,毕竟,它只有 Lock 和 Unlock 两个方法,使用起来还能复杂到哪里去?正常使用 Mutex 时,确实是这样的,很简单,基本不会有什么错误,即使出现错误,也是在一些复杂的场景中,比如跨函数调用 Mutex 或者是在重构或者修补 Bug 时误操转载 2021-10-12 17:57:55 · 223 阅读 · 0 评论 -
go 指针概念【1】
文章目录1. 基本类型指针的理解2. 引用类型指针的理解3. 值类型和引用类型4. 引用类型5. 栈内存和堆内存的区别6. &和*的意思7. 关于函数1. 基本类型指针的理解先看这两行代码。var n1 int = 666fmt.Println(n1)//结果:666fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值内存分布图如下。再看看这样两行代码,这里用到了&。var n1 int = 1//表示取n1的地址转载 2021-04-11 13:16:12 · 260 阅读 · 0 评论 -
使用swagger自动生成Api文档
https://razeencheng.com/post/go-swaggerhttps://blog.csdn.net/zhanggonglalala/article/details/98070986原创 2020-12-18 17:00:33 · 178 阅读 · 0 评论 -
golang web开发之resty模块
文章目录1. Resty简介2. GET方法3. POST方法4. PUT方法5. 高级应用5.1 代理5.2 重试6. 中间件1. Resty简介微服务开发中服务间调用的主流方式有两种HTTP、RPC,HTTP相对来说比较简单。本文将使用 Resty 包来实现基于HTTP的微服务调用。Resty 是一个简单的HTTP和REST客户端工具包,简单是指使用上非常简单。Resty在使用简单的基础上提供了非常强大的功能,涉及到HTTP客户端的方方面面,可以满足我们日常开发使用的大部分需求。go get安.原创 2020-12-18 16:41:16 · 5762 阅读 · 1 评论 -
Go type 声明变量
1. type定义新类型声明格式:(是类型的组合)package mainimport ( "fmt" "reflect")type bigint int64func main() { var x bigint = 100 fmt.Printf("x 的值是:%v\n", x) fmt.Printf("x 的类型是:%v\n", reflect.TypeOf(x)) type smallint int8 var y smallint = 1原创 2020-12-15 17:01:33 · 1653 阅读 · 0 评论 -
go run 报错cannot find module for path….
export GO111MODULE=off原创 2020-11-20 10:53:57 · 4951 阅读 · 0 评论 -
Go 常量之 iota
文章目录1、iota只能在常量的表达式中使用。2、每次 const 出现时,都会让 iota 初始化为0.3、自定义类型4、可跳过的值5、位掩码表达式6、定义数量级7、定义在一行的情况8、中间插队1、iota只能在常量的表达式中使用。fmt.Println(iota) 编译错误: undefined: iota2、每次 const 出现时,都会让 iota 初始化为0.const a = iota // a=0const ( b = iota //b=0 c原创 2020-11-19 22:40:34 · 851 阅读 · 0 评论 -
Go 并发编程Mutex(二)--源码
们从 Mutex 的一个简单实现开始,看看它是怎样逐步提升性能和公平性的。在这个过程中,我们可以学习如何逐步设计一个完善的同步原语,并能对复杂度、性能、结构设计的权衡考量有新的认识。经过这样一个学习,我们不仅能通透掌握 Mutex,更好地使用这个工具,同时,对我们自己设计并发数据接口也非常有帮助。那具体怎么来讲呢?我把 Mutex 的架构演进分成了四个阶段,下面给你画了一张图来说明。“初版”的 Mutex 使用一个 flag 来表示锁是否被持有,实现比较简单;后来照顾到新来的 goroutine,所以会让转载 2020-10-22 10:59:07 · 314 阅读 · 0 评论 -
Go container 容器数据类型:heap、list 、ring
该包实现了三个复杂的数据结构:堆,链表,环。 这个包就意味着你使用这三个数据结构的时候不需要再费心从头开始写算法了。这里的堆使用的数据结构是最小二叉树,即根节点比左边子树和右边子树的所有值都小。 go 的堆包只是实现了一个接口,我们看下它的定义:type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove a原创 2020-10-22 10:57:49 · 511 阅读 · 0 评论 -
Go CAS操作
go中的Cas操作与java中类似,都是借用了CPU提供的原子性指令来实现。CAS操作修改共享变量时候不需要对共享变量加锁,而是通过类似乐观锁的方式进行检查,本质还是不断的占用CPU 资源换取加锁带来的开销(比如上下文切换开销)。下面一个例子使用CAS来实现计数器package mainimport ( "fmt" "sync" "sync/atomic")var ( counter int32 //计数器 wg sync.Wai原创 2020-10-21 18:06:21 · 1404 阅读 · 0 评论 -
Go Mutex【1】并发编程详解
并发场景说起并发访问问题,真是太常见了,比如多个 goroutine 并发更新同一个资源,像计数器;同时更新用户的账户信息;秒杀系统;往同一个 buffer 中并发写入数据等等。如果没有互斥控制,就会出现一些异常情况,比如计数器的计数不准确、用户的账户可能出现透支、秒杀系统出现超卖、buffer 中的数据混乱,等等,后果都很严重这些问题怎么解决呢?对,用互斥锁,那在 Go 语言里,就是 Mutex。互斥锁叫做排它锁。那在 Go 标准库中,它提供了 Mutex 来实现互斥锁这个功能。Mutex 是使用最原创 2020-10-21 16:23:42 · 429 阅读 · 0 评论 -
Go 如何获取文件的大小
Read字节方式第一种,是最直观会想到的,也就是打开文件,把文件读取一遍。func main() { file,err:=os.Open("water") if err ==nil { sum := 0 buf:=make([]byte,2014) for { n,err:=file.Read(buf) sum+=n if err==io.EOF {转载 2020-08-06 02:32:34 · 1513 阅读 · 1 评论 -
ginkgo的三个标志
F、X和P,可以用在Describe、Context、It等任何包含测试例的模块F含义Focus,使用后表示只执行该模块包含的测试,当里层和外层都存在Focus时,外层的无效,即下面代码只会执行B测试用例P的含义是Pending,即不执行,用法和F一样,规则的外层的生效X和P的含义一样还有一个跳过测试例的方式是在代码中加Skippending您可以将单个Spec或容器标记为待定。这将阻止Spec(或者容器中的Specs)运行。您可以在您的Describe, Context, It 和 Mea原创 2020-07-28 18:03:31 · 597 阅读 · 0 评论 -
ginkgo 测试常用模块
常用模块列表:模块功能描述ItIt 包含的代码为一个测试用例Specify和 It 功能一致, 可作为别名在适当位置替换 ItDescribe将一个或多个测试用例归类Context同 DescribeBeforeEach每个测试用例执行前执行该段代码AftreEach每个测试用例执行后执行该段代码JustBeforeEach在 BeforeEach 之后,执行测试用例之前执行JustAfterEach在执行测试用例之后,Aftr原创 2020-07-28 17:47:53 · 1582 阅读 · 0 评论 -
ginkgo 测试入门
简介Ginkgo是一个BDD风格的Go测试框架,旨在帮助您有效地编写富有表现力的综合测试。安装$ go get github.com/onsi/ginkgo/ginkgo$ go get github.com/onsi/gomega/...ginkgo入门测试$ go env |grep -i gopathGOPATH="/usr/local/gopath"$ cd /usr/local/gopath/src$ mkdir books$ cd books$ ginkgo boots原创 2020-07-28 16:55:32 · 1340 阅读 · 0 评论 -
go程序员开发效率神器汇总
一. 开发工具1)sql2go用于将 sql 语句转换为 golang 的 struct. 使用 ddl 语句即可。例如对于创建表的语句: show create table xxx. 将输出的语句,直接粘贴进去就行。http://stming.cn/tool/sql2go.html2)toml2go用于将编码后的 toml 文本转换问 golang 的 struct.https://xuri.me/toml-to-go/3)curl2go用来将 curl 命令转化为具体的 golang转载 2020-07-26 23:16:45 · 480 阅读 · 0 评论 -
go 引入本地包详解
参考连接:https://zhuanlan.zhihu.com/p/109828249原创 2020-05-25 22:33:17 · 4210 阅读 · 0 评论 -
Go Modules 管理包工具
简介在 Java 的项目中,有 Maven 和 Gradle 这些很好用的依赖版本管理工具,简直不要太方便了,但是在 Golang 的项目中,之前的 Golang 官方并没有提供版本管理工具,我们以前用 go get 获取依赖其实是有潜在危险的,因为我们不确定最新版依赖是否会破坏掉我们项目对依赖包的使用方式,即当前项目可能会出现不兼容最新依赖包的问题。之后官方出了一个 vendor 机制,将项目...原创 2020-05-08 11:09:25 · 460 阅读 · 1 评论 -
Go 获取 URL 实战
获取一个URL的bodypackage mainimport ( "fmt" "io/ioutil" "net/http" "os")func main() { for _, url := range os.Args[1:] { resp, err := http.Get(url) //http.Get函数是创建HTTP请求的...原创 2020-05-08 00:41:00 · 1655 阅读 · 1 评论 -
Go 查找重复的行
第一种:os.stdinpackage mainimport ( "bufio" "fmt" "os")func main() { counts := make(map[string]int) input := bufio.NewScanner(os.Stdin) for input.Scan() { counts[inp...原创 2020-05-07 15:20:44 · 477 阅读 · 1 评论 -
Go 编写 echo 命令
第一种package mainimport ( "fmt" "os")func main() { var s, sep string for i := 1; i < len(os.Args); i++ { s += sep + os.Args[i] sep = " " } fmt.Println(s)...原创 2020-05-07 14:26:29 · 905 阅读 · 1 评论 -
Go 代理加速配置
官网文档:https://goproxy.io/zh/docs/introduction.html1. Go 版本是 1.13 及以上 (推荐)go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.io,direct#设置不走 proxy 的私有仓库,多个用逗号相隔(可选)go env -w GOPRIVATE=*.cor...原创 2020-04-29 17:18:37 · 2649 阅读 · 1 评论 -
Go 通过 import 导入包
1 单行导入import "fmt"import "sync" 2 多行导入import( "fmt" "sync")3 使用别名我们导入了两个具有同一包名的包时产生冲突,此时这里为其中一个包定义别名import ( "crypto/rand" mrand "math/rand" // 将名称替换为mrand避免冲突)我们导入了一个名字很长...原创 2020-04-03 01:38:19 · 7722 阅读 · 0 评论 -
Go struc 结构体
类型可将类型分为命名和未命名两大类:命名类型包括 bool、int、string 等array、slice、map 等和具体元素类型、长度等有关,属于未命名类型。具有相同声明的未命名类型被视为同一类型具有相同基类型的指针。具有相同元素类型和长度的 array。具有相同元素类型的 slice。具有相同键值类型的 map。具有相同元素类型和传送方向的 channel。具有相同...原创 2020-04-12 22:01:14 · 706 阅读 · 1 评论 -
Go 运算符总结
1.算数运算符下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。+ 相加 A + B 输出结果 30- 相减 A - B 输出结果 -10* 相乘 A * B 输出结果 200/ 相除 B / A 输出结果 2% 求余 B % A 输出结果 0++ 自增 A++ 输出结果 11-- 自减 A-- 输出结果 92.关系运算符下表列出了所有Go语言的关系运...原创 2020-03-25 15:14:20 · 631 阅读 · 1 评论