
Golang
文章平均质量分 67
rookieyx
这个作者很懒,什么都没留下…
展开
-
current file is not included in a workspace moduleg 存在多个 main函数的 Go项目 无法成功导包
注: gopro 作为程序的根目录,hystrix 作为子目录,并且均使用 go mod init 命令对 gopro, hystrix 做了项目的初始化。go get “github.com/afex/hystrix-go/hystrix” 进行导入包,(一开始仅对 hystrix 子目录进行了 go get 的导入)导入成功后,在代码里利用 import 导入,但遇到了以下报错。在项目的根目录利用 go get 命令进行所需包的导入。学习 hystria, 尝试自测案例,使用了。原创 2023-10-25 17:15:07 · 1162 阅读 · 0 评论 -
Go 报错 error obtaining VCS status: exit status 128 Use -buildvcs=false to disable VCS stamping.
新建一个 Go 项目打算利用 air 进行热重载时,使用。之后重新启动 air, 启动成功。启动 air ,发现报错。原创 2023-09-10 20:38:57 · 1236 阅读 · 0 评论 -
Golang之路---04 并发编程——信道死锁经典错误案例
每个缓冲信道,都有容量,当信道里的数据量等于信道的容量后,此时再往信道里发送数据,就失造成阻塞,必须等到有人从信道中消费数据后,程序才会往下进行。,虽然保证了接收者代码在发送者之前执行,但是由于前面接收者一直在等待数据 而处于阻塞状态,所以无法执行到后面的发送数据。所以这个问题,解决方法很简单,只要在发送完数据后,手动关闭信道,告诉 range 信道已经关闭,无需等待就行。回顾前面的基础,我们知道使用 make 创建信道的时候,若不传递第二个参数,则你定义的是无缓冲信道,使用缓冲信道,而不使用无缓冲信道。原创 2023-08-08 20:00:00 · 206 阅读 · 0 评论 -
Golang之路---04 并发编程——互斥锁和读写锁
面对并发问题,我们始终应该优先考虑使用信道,如果通过信道解决不了的,不得不使用共享内存来实现并发编程的,那 Golang 中的锁机制,就是你绕不过的知识点了。举个例子,就像下面这段代码,我开启了三个协程,每个协程分别往 count 这个变量加1000次 1,理论上看,最终的 count 值应试为 3000。RWMutex 里提供了两种锁,每种锁分别对应两个方法,为了避免死锁,两个方法应成对出现,必要时请使用 defer。而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。原创 2023-08-07 14:00:00 · 287 阅读 · 1 评论 -
Golang之路---04 并发编程——WaitGroup
但在实际开发中,开发人员是无法预知,所有的 goroutine 需要多长的时间才能执行完毕,sleep 多了,主程序就阻塞了, sleep 少了,有的子协程的任务就没法完成。学习了信道后,我们知道,信道可以实现多个协程间的通信,那么我们只要定义一个信道,在任务完成后,往信道中写入true,然后在主协程中获取到true,就认为子协程已经执行完毕。上面使用信道的方法,在单个协程或者协程数少的时候,并不会有什么问题,但在协程数多的时候,代码就会显得非常复杂。Wait:阻塞当前协程,直到实例里的计数器归零。原创 2023-08-06 08:50:46 · 654 阅读 · 0 评论 -
Golang之路---04 并发编程——信道/通道
每个信道都只能传递一种数据类型的数据,所以在你声明的时候,你得指定数据类型(string int 等等)var 信道实例 chan 信道类型声明后的信道,其零值是nil,无法直接使用,必须配合make函进行初始化。信道实例 = make(chan 信道类型)上面两行可以合并成一句,即信道实例 := make(chan 信道类型)eg:创建一个可以传输int类型的信道,可以这样子写。// 定义信道 pipline := make(chan int)信道的数据操作,无非就两种:发送数据与读取数据。原创 2023-08-05 22:00:00 · 308 阅读 · 1 评论 -
Golang之路---04 并发编程——协程:goroutine
因为你没得选,也不需要选,它原生提供的 goroutine (也即协程)已经足够优秀,能够自动帮你处理好所有的事情,而你要做的只是执行它,就这么简单。对于刚学习Go的协程同学来说,可以使用 time.Sleep 来使 main 阻塞,使其他协程能够有机会运行完全,但你要注意的是,这并不是推荐的方式(后续我们会学习其他更优雅的方式)。main 的地位相当于主线程,当 main 函数执行完成后,这个线程也就终结了,其下的运行着的所有协程也不管代码是不是还在跑,也得乖乖退出。原创 2023-08-05 11:30:00 · 170 阅读 · 0 评论 -
Golang之路---02 基础语法——函数
函数体 }func:函数由 func 开始声明function_name:函数名称,函数名和参数列表一起构成了函数签名。[parameter list]:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。原创 2023-08-01 23:00:00 · 313 阅读 · 0 评论 -
Golang之路---04 项目管理——编码规范
文件若具有平台特性,应以 文件名_平台.go 命名,比如 utils_ windows.go,utils_linux.go,可用的平台有:windows, unix, posix, plan9, darwin, bsd, linux, freebsd, nacl, netbsd, openbsd, solaris, dragonfly, bsd, notbsd, android,stubs。若变量中有特有名词(以下列出),且变量为私有,则首单词还是使用全小写,如 apiClient。原创 2023-08-05 12:30:00 · 158 阅读 · 0 评论 -
Golang中空结构体的使用
事实上,对于集合来说,只需要 map 的键,而不需要值。即使是将值设置为 bool 类型,也会多占据 1 个字节,那假设 map 中有一百万条数据,就会浪费 1MB 的空间。一是节省资源,二是空结构体本身就具备很强的语义,即这里不需要任何值,仅作为占位符。但无论是 int 还是 bool 都会浪费额外的内存,因此呢,这种情况下,声明为空结构体是最合适的。因此呢,将map作为集合(Set)使用时,可以将值类型定义为空结构体,仅作为占位符使用即可。空结构体,和正常的结构体一样,可以接收方法函数。原创 2023-08-04 22:00:00 · 260 阅读 · 0 评论 -
Golang make和new的区别
目前来看new函数不常用,因为大家更喜欢用短语句声明的方式。原创 2023-08-04 10:00:00 · 152 阅读 · 0 评论 -
Golang之路---03 面向对象——反射
回到反射上来,当你使用 reflect.Typeof 和 reflect.Valueof 的时候,如果传递的不是接口变量的指针,反射世界里的变量值始终将只是真实世界里的一个拷贝,你对该反射对象进行修改,并不能反映到真实世界里。从以上,可以知道,不管是 i=18 ,还是 i=“Golang”,都是当程序运行到这里时,变量的类型,才发生了改变,这就是我们最开始所说的动态类型是程序运行时系统才能看见的类型。在这里,要注意的是,Kind 和 Type 是有区别的,Kind 表示更基础,范围更广的分类。原创 2023-08-03 21:30:00 · 269 阅读 · 0 评论 -
Golang之路---03 面向对象——类型断言
和上面一样,这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其值给 t,并且此时 ok 的值 为 true,表示断言成功。,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic。如果接口值的类型,并不是我们所断言的 T,就会断言失败,但和第一种表达式不同的事,这个。,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。静态类型为你断言的类型的对象,而要清楚。类型断言完成后,实际上会。原创 2023-08-03 23:00:00 · 212 阅读 · 0 评论 -
Golang之路---03 面向对象——空接口
空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口。每一个接口都包含两个属性,一个是值,一个是类型。而对于空接口来说,这两者都是 nil。package main import("fmt") //定义一个接口 type order interface {原创 2023-08-03 16:00:00 · 205 阅读 · 0 评论 -
Golang之路---03 面向对象——接口与多态
使用type关键字来定义接口如下所示,定义了一个叫order的接口,接口要求必须实现printName方法。原创 2023-08-02 23:30:00 · 902 阅读 · 0 评论 -
Golang之路---03 面向对象——结构体
在之前学过的数据类型中,数组与切片,只能存储同一类型的变量。若要存储多个类型的变量,就需要用到结构体,它是将多个任意类型的变量组合在一起的聚合数据类型。每个变量都成为该结构体的成员变量。可以理解为 Go语言 的结构体struct和其他语言的class有相等的地位,但是Go语言放弃大量面向对象的特性,所有的Go语言类型除了指针类型外,都可以有自己的方法,提高了可扩展性。在 Go 语言中没有没有 class 类的概念,只有 struct 结构体的概念,因此也没有继承。原创 2023-08-01 21:30:00 · 582 阅读 · 0 评论 -
Golang之路---02 基础语法——异常机制:panic 和 recover
当然能触发程序宕机退出的,也可以是我们自己,比如经过检查判断,当前环境无法达到我们程序进行的预期条件时(比如一个服务指定监听端口被其他程序占用),可以手动触发 panic,让程序退出停止运行。在 Golang 中,有不少常规错误,在编译阶段就能提前告警,比如语法错误或类型错误等,但是有些错误仅能在程序运行后才能发生,比如数组访问越界、空指针引用等,这些运行时错误会引起程序退出。但是 recover 的使用,有一个条件,就是它必须在 defer 函数中才能生效,其他作用域下,它是不工作的。原创 2023-08-02 20:30:00 · 383 阅读 · 0 评论 -
Golang之路---01 Golang VS Code创建项目
Golang使用包和模块来组织代码,包对应到文件系统就是文件夹,模块就是xxx.go的go源文件。一个包中会有多个模块,或者多个子包。早期使用的是gopath来管理项目,不方便,比较麻烦,现在我们使用gomod来管理项目。Visual Studio Code 首先打开你新创建的项目的文件夹,打开一个新终端。成功初始化后,会产生一个go.mod文件。创建文件,编写代码!原创 2023-07-31 15:48:56 · 517 阅读 · 0 评论 -
Golang之路---02 基础语法——流程控制(if-else , switch-case , for-range , defer)
defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行。使用了 defer 后,代码就显得简单直接,不管你在何处 return,都会执行 defer 后的函数。使用 defer 只是延时调用函数,此时传递给函数里的变量,不应该受到后续程序的影响。多个defer 是反序调用的,有点类似栈一样,后进先出。若是没有 defer,你可以写出这样的代码。for 后可接三种类型表达式。原创 2023-07-31 20:15:00 · 474 阅读 · 0 评论 -
Golang之路---02 基础语法——字典
字典(Map 类型),是由若干个 key:value 这样的键值对映射组合在一起的数据结构。key 不能是切片,不能是字典,不能是函数。原创 2023-07-29 20:28:20 · 525 阅读 · 0 评论 -
Golang之路---02 基础语法——数组与切片(slice)
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的。切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。切片是可索引的,并且可以由 len() 方法获取长度。注:一个切片在未初始化之前默认为 nil,长度为 0。len() 和 cap() 函数。原创 2023-07-30 20:00:00 · 281 阅读 · 0 评论 -
Golang之路---02 基础语法——常量 (包括特殊常量iota)
iota在const关键字出现时将被重置为0,const中每新增一行常量声明将使iota计数一次。iota是Golang语言的常量计数器,只能在常量表达式中使用。原创 2023-07-29 20:45:00 · 429 阅读 · 0 评论 -
Golang之路---02 基础语法——变量
使用 var , Go 会对其进行隐式初始化,比如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil。若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,但是很多情况下,我们并不需要这么高的精度.Go 语言是静态类型语言,编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。var是关键字,name为变量名,type是类型。又称占位符,空白标识符。原创 2023-07-29 20:00:00 · 304 阅读 · 0 评论 -
Golang之路---01 Golang的安装与配置
再新建一个GOPATH的变量,变量值为go的工作目录(之前新建的文件夹的位置)在系统变量下选择新建,添加一个GOROOT的变量,变量值为当前go的安装目录。管理扩展,在搜索框中输入Go ,选中结果列表第一项,点击install安装。双击下载后的文件进行安装,可根据需要自定义选择解压后的文件位置。在src目录下创建一个新的文件夹,这里我命名为initial。点击新建,加入下面两项,值为之前两个目录的bin目录。接着打开终端(cmd)输入以下配置。找到---->编辑系统环境变量。输入以下命令查看是否配置成功。原创 2023-07-28 18:05:05 · 900 阅读 · 0 评论