Go学习笔记
文章平均质量分 74
oceanweave
这个作者很懒,什么都没留下…
展开
-
【环境配置】go多版本管理工具gvm
Go语言版本管理器(Gvm)是管理Go语言环境的开源工具。支持安装多个版本的Go并管理每个项目的模块。它最初由开发,Gvm与Ruby RVM类似,允许你为每个项目或一组项目创建一个开发环境,分离不同的Go版本和包依赖关系,来提供更大的灵活性,以防不同版本造成的问题。Gvm管理Go的多个版本,包括安装、卸载和指定使用Go的某个版本查看官方所有可用的Go版本,同时可以查看本地已安装和默认使用的Go版本管理多个GOPATH,并可编辑Go的环境变量可将当前目录关联到GOPATH可以查看GOROOT。原创 2024-08-05 11:17:38 · 1233 阅读 · 1 评论 -
【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)
go mod init {项目名},不推荐随便命名项目名,这样不便于以后发布到 github,若本地使用的话可以随意命名项目名首先在 github 创建个 repo然后初始化go mod init {项目名}本地创建的项目不上传 github 的话,项目名随便指定若该项目需要上传 github,并需要后期 go get 下载的话,go mod init 一定要与 github 上存储仓库路径一致。原创 2023-11-19 11:28:09 · 5173 阅读 · 0 评论 -
Go 易错点值 Sort 自定义属性排序
Golang之Sort包对于不同结构体,实现 Sort 包规定的几个方法,便可以按照自己想要的【属性】自行排序package main import("fmt" "sort") // sort.Sort 自定义排序 // 首先要自定义类型 // 之后要实现自定义排序 需要实现三个方法 Len 返回长度 Less 比较(升序还是降序) Swap 交换 type arrTest [ ] int func main() {原创 2023-01-05 18:17:04 · 255 阅读 · 0 评论 -
Go 易错点之协程(中间函数退出不会导致调用的 goroutine 退出)
【代码】Go 易错点之协程(中间函数退出不会导致调用的 goroutine 退出)原创 2023-01-05 18:18:43 · 304 阅读 · 0 评论 -
Go 学习之 grpc
RPC(Remote Procedure Call),即远程过程调用。它允许像调用本地服务一样调用远程服务。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。首先与RPC(远程过程调用)相对应的是本地调用。原创 2023-01-05 18:15:35 · 771 阅读 · 0 评论 -
Go 学习之 接口多态(同一接口的不同结构体实现不同行为)
【代码】Go 学习之 接口多态(同一接口的不同结构体实现不同行为)原创 2023-01-05 18:09:43 · 617 阅读 · 0 评论 -
Go 项目生成版本号
本文介绍了一种如何通过 ldflags -X 变量传递的方式。使用这种方式我们可以在构建时轻松设定一些元信息,例如本文示例的程序版本信息。而这种构建的动作不应该手动去执行,而是放入到 CI/CD 流程中,让整个过程变得更加丝滑。关于 ldflags 的用例或版本号管理方案,如果大家有更好的想法,欢迎留言交流。原创 2022-10-14 18:00:37 · 1120 阅读 · 0 评论 -
【Go mod 学习之 go sum 篇】用于验证 go mod 文件和依赖包的完整性
中的依赖包,下载的依赖包会缓存在本地,以便下次构建。考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个。在Go module机制下,我们需要同时使用依赖包的名称和版本才可以准确的描述一个依赖,为了方便叙述,下面我们使用。文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与。存在的意义,即如果不使用我期望的版本,就不能构建。中记录的依赖包,并计算本地依赖包的哈希值,然后与。中记录的是完全一致的,从而达到一致构建的目的。(校验和数据库)验证过的。原创 2022-10-14 17:59:10 · 1652 阅读 · 0 评论 -
【Go mod 学习之依赖包存储篇】go get 下载的包存储在哪?
由于依赖包的每个版本都有一个唯一的目录,所以在多项目场景中需要使用同一个依赖包的多版本时才不会产生冲突。另外,由于依赖包的每个版本都有唯一的目录,也表示该目录内容不会发生改变,也就不必再存储其位于版本管理系统(如git)中的信息。命令不指定特定版本时,默认会下载最新版本,即v1.1.1,如软件包有新版本发布,实验结果将有所不同。中使用错误的包名,除了会增加额外的不必要存储外,还可能会影响。在下面的操作中,我们会使用。,该目录下只保存特定依赖包的一个版本,而在。目录,它用来存储依赖包的缓存,简单说,原创 2022-10-14 17:58:09 · 8321 阅读 · 0 评论 -
【Go mod 学习之伪版本篇】采用 commit id 进行 go get 会生成伪版本号
在实际项目中,有时不得不直接使用一个commit ID,比如某项目发布了v1.5.0版本,但随即又修复了一个bug(引入一个新的commit ID),而且没有发布新的版本。此时,如果我们希望使用最新的版本,就需要直接引用最新的commit ID,而不是之前的语义化版本v1.5.0。使用commit ID的版本在Go语言中称为,可译为"伪版本"。伪版本的版本号通常会使用格式,其中vx.y.z看上去像是一个真实的语义化版本,但通常并不存在该版本,所以称为伪版本。另外表示某个commit ID的前12位,而。原创 2022-10-14 17:57:14 · 2287 阅读 · 0 评论 -
【Go mod 学习之版本选择篇】go mod 自动为你的项目选择合适的依赖包版本
本节我们先是介绍了Go 语言针对依赖包版本管理的约定,这个不能算是强制性的要求,但如果不遵守该约定,后续该依赖包的使用者将会遇到各麻烦,最终有可能弃用这个不规范的依赖包。接着介绍了Go module机制所采用的自动版本选择算法,除了自动版本选择以外,我们还可以显式地指定依赖包的版本。另外,除了在go.mod文件中指定依赖的tag 版本号以外,还可以使用假的版本号,这些内容我们将在后续的章节中分别展开介绍。原创 2022-10-14 17:56:10 · 3551 阅读 · 0 评论 -
【Go mod 学习之 incompatible 篇】对不符合语义版本规范的包进行标记
说明你引用了一个不规范的Module,正常情况下,只能说明这个Module版本未遵循版本化语义规范。的角度,如果迟迟不能将自身变得"规范",那么其他项目有可能放弃本Module,转而使用其他更规范的Module来替代,开源项目如果没有使用者,也就走到了尽头。,因为其Module名字未遵循Golang所推荐的风格,即Module名中附带版本信息,我们称这个Module为不规范的Module。在前面的章节中,我们介绍了Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循。原创 2022-10-14 17:54:32 · 1604 阅读 · 0 评论 -
【Go mod 学习之 exclude 篇】禁止引用多个依赖包间接引入的bug版本包
*答:**我们引用多个包,这些包中可能都包含着【相同的某个包,同时版本也很杂乱】,这个包也会间接的被引用到本项目,但是【该包有些版本有bug,我们不想引入】,所以采用【exclude】排除该包的 bug 版本。**作用:**排除指定 go 包【有bug(或不想要)的版本】版本,但如果将来引用了其他包,正好其他包引用了uuid的。**问题:**直接不引用就好,为什么会有这个需求?版本,但如果没有更新的版本时将会报错而无法编译。在本例中,在选择版本时,跳过uuid。版本的话,此时添加的。原创 2022-10-14 17:53:13 · 1786 阅读 · 0 评论 -
【Go mod 学习之 indirect 篇】帮依赖包记录他的依赖情况
在上面的例子中,如果某个依赖B 没有go.mod文件,在A 的go.mod文件中已经记录了依赖B及其版本号,为什么还要增加间接依赖呢?我们知道Go module需要精确地记录软件的依赖情况,虽然此处记录了依赖B的版本号,但B的依赖情况没有记录下来,所以如果B的go.mod文件缺失了(或没有)这个信息,则需要在A的go.mod文件中记录下来。此时间接依赖的版本号将会根据Go module的版本选择机制确定一个最优版本。原创 2022-10-14 17:51:43 · 1247 阅读 · 0 评论 -
【Go mod 学习之 replace 篇】解决 go 本地依赖、无法拉取依赖、禁止依赖等问题
需要说明的是,正常情况下不需要使用replace来修改版本,最直接的办法是修改require即可,虽然replace也能够做到,但这不是replace的一般使用场景。blog 是应用的入口,main 所在位置,而 article 可以理解为你写的一个公共的库,其中提供了一个函数 Hello()。如果想在你的模块如果想引入你本地其他地方的模块,可以尝试通过 replace 指定目录,而且前提是你的 article 也得 go 的一个模块,而不是按 gopath 下的某个包来引入。原创 2022-10-14 16:29:35 · 20268 阅读 · 3 评论 -
【k8s admission 学习】go mod引用同项目go文件技巧
若在 webhook 目录的 main.go 函数中引用 pkg 目录中的 webhook.go 中的函数,该怎么应用呢?答:go mod 名 + 目录名。原创 2022-10-07 12:02:21 · 350 阅读 · 0 评论 -
【转载】使用Cobra开发自己的命令行工具
cobra的flag默认情况下都是可选的,但如果我们想强制要求用户使用命令行工具的时候携带某些flag,也是可行的。,这是因为我们前面为helloCmd声明flag的方式不同(详见代码注释)。如果想在命令中加入参数,应该怎么做呢?如果我们想为hello定制flag,应该怎么做呢?让我们直接运行一下这个程序,看看输出是怎样的。,所以只打印出了详细的描述信息。现在cmd文件夹下应该多出了一个。以上就是cobra的简单使用。可以看到,由于我们还没有实现。可以看到,test子命令对于。是可以接收的,但是无法解析。转载 2022-09-28 10:26:53 · 257 阅读 · 0 评论 -
Go 学习之 interface 方法定义的坑
方法分为【值接收者方法】和【指针接收者方法】【值变量】或【指针变量】都可以随意调用【这两种类型的方法】,因为执行时【编译器会进行自动转换】就相当于,【值变量】调用【指针接收者方法】,编译器会自动将【该变量】转换为【该变量的地址】,从而传入【该方法】,所以【方法内的行为会改变该变量的原值】【指针变量】调用【值接收者方法】,编译器会自动将【该指针】转换为【值】,就是【值传递】,也就是【相当于复制该变量的值,传入到方法】,因此【值接收者方法不会改变变量的原值】【值接收者方法】不会改变原值。原创 2022-09-27 09:29:17 · 341 阅读 · 0 评论 -
Go学习值reflect反射篇
简言之:就是利用【反射功能】注册【一些信息】到程序可执行文件中,因此在程序运行期间,可以利用【反射功能】取出或修改【这些信息】反射是**【指在程序运行期间对程序本身进行访问和修改的能力】**。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期间将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期间获取类型的反射信息,并且有能力修改它们。原创 2022-09-09 18:11:57 · 837 阅读 · 0 评论 -
Go 学习之 Context 篇
Context被称之为上下文,用它我们可以,它可以实时跟踪我们的每一个Go协程,有了这个特性,我们只需要了解怎么使用就可以了。} }复制Deadline方法会返回设置的截止时间,如果协程运行到了这个时间点,Context则会自动触发取消,实现协程的关闭。Done方法是一个只读的通道,它意味着如果可以读,则说明我们的context发起的取消。Err()方法是在运营中出现错误会及时的返回Value()方法则可以在跟踪协程是带上key-value的值。原创 2022-09-08 14:37:14 · 417 阅读 · 0 评论 -
Go 学习之 channel 篇
【代码】Go 学习之 channel 篇。原创 2022-09-07 18:28:08 · 827 阅读 · 0 评论 -
Go 学习之 io.Reader 从源码了解如何编写
Go 入门很简单:Writer和Reader接口Go语言实战笔记(十九)| Go Writer 和 ReaderGo学习笔记(1)—io.ReaderWritergolang io.Reader和io.Writer作用常用的几个实现围绕,有几个常用的实现:原创 2022-09-04 12:41:12 · 458 阅读 · 0 评论 -
Go 学习之 测试函数编写与文档记录
【代码】Go 学习之 测试函数编写与文档记录。原创 2022-09-01 11:05:47 · 135 阅读 · 0 评论 -
Go 学习之 strings.Builder 篇
参考Golang 中 strings.builder 的 7 个要点Go 字符串拼接6种,最快的方式 – strings.builderhttps://pkg.go.dev/strings#Builderhttps://play.golang.org/理解自从 Go 1.10 发布的一个月以来,我多少使用了一下 strings.Builder,略有心得。你也许知道它,特别是你了解 bytes.Buffer 的话。所以我在此分享一下我的心得,并希望能对你有所帮助。1. 4 类原创 2022-04-29 17:05:33 · 2875 阅读 · 0 评论 -
Go 学习之 json tag 篇
文章目录参考理解json tagjson omitempty结构体(指针形式)才可使用 omitemptyjson inlinejson 反序列化 类型不符处理参考Golang中 json tag 标签的作用和用法讲解Golang json用法详解(一)理解json tag默认情况下序列化与反序列化使用的都是结构体的原生字段名,可以通过给结构体字段添加json tag来指定序列化后的字段名。标签冒号前是类型,后面是标签名。例如代码:// Product _type Produc原创 2022-03-29 14:58:34 · 2813 阅读 · 1 评论 -
Go 小技巧之接口嵌套与实现
接口嵌套与实现接口的嵌套就相当于,函数数量的累加type Print3 interface { Print2 PrintSingle}要实现 Print3 接口就相当于实现 print1,print2,print3 函数结构体嵌套子结构体实现了接口就相当于父结构体实现了接口device 实现了 Print2 接口,其父结构体 device2 也实现了此接口父结构体可以调用子结构体中的数据device2 可使用子结构体 device 中的 str 数据原创 2022-02-10 15:45:39 · 572 阅读 · 0 评论 -
Go 学习之爬虫(抓取动态页面)
文章目录1 | 参考2 | 构建2.1 | 首先获得想要的 html 元素2.2 | 获取动态 html 页面2.3 | 解析 html 数据2.4 | main 函数2.5 | 完整代码1 | 参考Golang+chromedp+goquery 简单爬取动态数据golang goquery selector(选择器) 示例大全 飞雪无情excelize —— go 的 excel 库文档说明go读写excel文件HTML DOM querySelector() 方法g原创 2021-12-01 16:02:56 · 3093 阅读 · 0 评论 -
Go 学习之 error 篇
文章目录1 | 基础概念2 | 创建方法3 | error 的用途(异常处理)3.1 | 值比较,进行下一步处理3.2 | 携带信息,向上层传递3.3 | 小结4 | 链式 error1 | 基础概念// error 是个接口type error interface { Error() string}// errorString 是 errors 包的私有类型type errorString struct { s string}2 | 创建方法创建 error 的方法err原创 2021-11-23 11:39:52 · 534 阅读 · 0 评论 -
Go 学习之 defer 篇
文章目录1 | 后进先出2 | 理解 defer 执行的时机3 | defer 函数的参数在语句出现时就已经确定了4 | 运用学习4.1 | 主函数拥有匿名返回值,返回字面量4.2 | 主函数拥有匿名返回值,返回变量4.3 | 主函数拥有具名返回值5 | defer 的底层原理了解5.1 | defer 的创建与执行5.2 | defer 的性能优化分析6 | recover 函数一般配合来使用1 | 后进先出这个大家都差不多明白了,后进入的 defer 函数先执行func main() {原创 2021-11-23 11:39:01 · 593 阅读 · 0 评论 -
Go 学习之依赖管理篇
文章目录1|基础环境变量理解2|依赖管理工具的产生2.1|依赖的查找2.2|GOPATH 的缺点2.3|vendor2.4|Go Module2.5|Go Module 的使用3|依赖包的存储4|go.sum 文件说明4|其他环境变量说明1|基础环境变量理解- GOROOT 指向 Go 的安装目录(包含着开发 Go 应用程序所需的所有组件,如编译器、标准库和文档),存储标准库- GOPATH 指向用户域(用户项目需要位于 src/ 目录中,使每个用户有自己的工作空间,互不打扰),存储第三方库和项目原创 2021-11-22 18:15:00 · 819 阅读 · 0 评论 -
Go 小技巧之链式调用
参考[GO]小技巧,如何实现一个链式操作使用// 主要就是 前一个方法的返回值,具有下一个方法,因此可以实现链式调用package mainimport "fmt"type Stu struct { Name string Age int}func (p *Stu) SetName(name string) *Stu { p.Name = name return p}func (p *Stu) SetAge(age int) *Stu {原创 2021-11-16 11:40:46 · 1380 阅读 · 0 评论 -
Go学习之并发控制篇(Channel,WaitGroup,Context)
文章目录参考并发控制通道 channel举例控制子协程模拟管道WaitGroup使用示例实现原理预备知识 —— 信号量WaitGroup 数据结构接口Context简述作用实现原理接口定义空 context四种方法实现不同类型 context小结cancelCtx —— WithCancel()方法实现使用实现原理timerCtx —— WithDeadline()方法实现使用实现valueCtx —— WithValue()方法实现使用实现参考GO 专家编程地鼠文档Go语言实战笔记(十原创 2021-11-15 16:23:17 · 1430 阅读 · 0 评论
分享