![](https://img-blog.csdnimg.cn/20200815122255738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Go知识点
Go 知识点
、Edgar
Coding with fun
展开
-
go get 指定commit 版本
今天使用go get命令下载包的时候,最开始因为自己上传到GitHub上的module名称有误,没有声明为github.com/xx/xx格式,后来修改之后重新push了一下,但是go get还是之前的commit的版本,这种情况下我们使用下面的命令即可// 这里以github.com为例,当然其他的仓库也是可以的go get github.com/xxx/xxx@commit-idcommit-id可以在本地查看,使用git log或者git reflog均可,也可以在网上仓库上查看,GitHub原创 2021-06-20 15:52:24 · 5262 阅读 · 1 评论 -
Go中对于时间戳的操作
Go time包中包含了一系列对于时间的操作,下面的代码演示了如何获取到Time类型对应的时间戳以及如何将时间戳转换成对应的Time类型package mainimport ( "fmt" "time")func main(){ // 解析时间 t, err := time.Parse("2006-01-02 15:04:05", "2021-01-13 14:04:05") if err != nil{ fmt.Println(err) return } // 输出时间原创 2021-01-13 14:15:36 · 607 阅读 · 0 评论 -
RSA算法的加解密过程及Go语言中RSA使用
RSA算法过程首先选择两个不相等的素数 p,qp, qp,q计算p,qp, qp,q的乘积n=pqn=pqn=pq,nnn即为密钥的长度计算n的欧拉函数φ(n)=(p−1)(q−1)\varphi(n)=(p-1)(q-1)φ(n)=(p−1)(q−1)随机选择一个整数eee使得1<e<φ(n),(e,φ(n))=11<e<\varphi(n), (e, \varphi(n))=11<e<φ(n),(e,φ(n))=1,即e,φ(n)e, \var原创 2021-01-12 12:07:12 · 524 阅读 · 0 评论 -
golang multiple-value xxx in single-value context
使用下面的代码的时候会出现这样的错误,原因是user.Password()返回值有两个,但是只能在fmt.Println中一个位置只能使用一个值,所以会出现这样的问题user := url.UserPassword("username", "password")fmt.Println("username: ", user.Username())fmt.Println("password: ", user.Password())fmt.Println(user.String())解决方法:分别定原创 2021-01-01 01:36:23 · 4757 阅读 · 0 评论 -
http2: request body larger than specified content length
在使用golang发送POST请求的时候,由于需要发送数据,所以需要使用mime/multipart包,不过在某次测试的时候出现了下面的错误http2: request body larger than specified content length很明显可以判断出错误的原因,但是错误在哪并不是很清楚,后来debug了一段时间之后,发现将创建的request返回之后,所得到的req.Body字段和之前有所不同,增加了一段内容,后来发现是因为用来写入body的writer并没有关闭,使得创建的requ原创 2020-12-19 00:05:33 · 611 阅读 · 1 评论 -
golang中的值方法和指针方法
和其他的面向对象编程语言有所区别,golang中并没有直接提供对象语法,比如类似python, C++等中的class,而是以struct来间接实现面向对象编程在给结构体对象添加方法的时候,接收者参数可以有两种类型,一种是值参数,还有一种则是指针参数func(receiver Type) Methodfunc(receiver *Type) Method值对象可以调用值方法&指针方法type Person struct{ Name string Age int }// 值方法原创 2020-12-17 10:56:57 · 2262 阅读 · 1 评论 -
使用golang对文件进行zip打包和解包
打包程序package mainimport ( "archive/zip" "fmt" "os")func main() { out, err := os.Create("test.zip") if err != nil { fmt.Println("Create error: ", err) return } defer out.Close() writer := zip.NewWriter(out) var files = []struct { Name原创 2020-10-07 19:30:13 · 2150 阅读 · 0 评论 -
linux 系统 安装golang最新版
下载之后解压到/usr/localwget https://golang.google.cn/dl/go1.15.2.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz 将go添加到环境变量,本地中为.bashrc,有可能是.bash_profilecd ~nano .bashrc 加入export PATH=$PATH:/usr/local/go/bin然后激活source .bashr原创 2020-10-06 20:34:17 · 536 阅读 · 0 评论 -
golang 交叉编译
按照下面的方式进行编译,亲测可行目的系统方式windowsgo env -w CGO_ENABLED=0 go env -w GOOS=windows go env -w GOARCH=amd64 go buildMacgo env -w CGO_ENABLED=0 go env -w GOOS=darwin go env -w GOARCH=amd64 go buildLinuxgo env -w CGO_ENABLED=0 go env -w GOOS=li原创 2020-09-18 14:59:48 · 327 阅读 · 0 评论 -
net/url 基本使用
package url 实现了 url 的解析以及查询字段的转义方法使用func PathEscape(s string) stringPathEscape 函数可以转义字符串使其能够安全的放置在一个 URL 路径中,该方法会根据需要将特殊字符替换成%XXfunc PathUnescape(s string) (string, error)PathUnescape 是 PathEscape 的反变换,与 QueryUnescape 类型,但是 PathUnescape 不会将+转义成""(空格)原创 2020-09-03 23:31:45 · 1046 阅读 · 0 评论 -
errors 基本使用
package errors 中实现了对 error 类型数据的相关操作函数概念如果一个错误类型有一个 Unwrap 方法返回一个错误类型,则说该错误包装(wrap)另外一个错误。比如说 e.Unwrap()返回一个非 nil 的错误类型 w,那么我们说 e 包装(wrap)了 wUnwrap 方法打开一个被包装的错误,如果它的参数类型含有 Unwrap 方法,它会调用该方法一次,否则它返回 nil一个创建 wrapped errors 最简单的方法就是调用fmt.Errorf函数,并且使用%w占位原创 2020-09-03 19:49:45 · 1641 阅读 · 0 评论 -
io/ioutil 基本使用
io/ioutil 包中实现了一些 io 工具函数,拿来即用方法使用func ReadAll(r io.Reader) ([]byte, error)ReadAll 函数从一个 io.Reader 接口参数中一次性读取所有数据,并返回func ReadFile(filename string) ([]byte, error)ReadFile 函数从 filename 指定的文件中读取数据并返回文件的内容func WriteFile(filename string, data []byte, pe原创 2020-09-03 16:36:24 · 576 阅读 · 0 评论 -
path/filepath 基本使用
标准库path/filepath中提供了对各个操作系统文件路径的操作函数,一般情况下不要使用path,因为package path 只兼容以/为路径分隔符的系统方法使用func IsAbs(path string) bool该函数以路径为参数,如果该路径为绝对路径,那么返回true,如果不是返回falsefunc Abs(path string) (string, error)// Abs returns an absolute representation of path.// If the原创 2020-09-03 11:02:44 · 9943 阅读 · 0 评论 -
sync/atomic 基本使用
首先,我们来理解一下什么是原子操作,所谓原子操作就是指该操作是不可分割的,在执行完毕之前不会被其他的任务或者事件中断,该操作的内部不能被高层的操作发现并分割执行,处理器会首先保证我们这些操作内存的原子性,也就是说当向该内存地址写入或者读取数据的时候,其他的操作无法获取该内存的地址,也就是保证了该内存所保存数据的正确性。在sync/atomic中提供了许多原子操作支持,主要有五大类:Loadload 一类的方法接收一个地址,并返回该地址中的数据该类方法主要负责从相应的内存地址中获取对应的值return原创 2020-09-01 09:46:57 · 1472 阅读 · 0 评论 -
[]byte, string以及[]rune模拟内置转换
[]byte, string, []rune在golang中可以进行转换,下面提供一些对应的模拟代码str -> []bytefunc str2bytes(s string) []byte{ // 申请一个切片保存数据 temp := make([]byte, len(s)) // 循环进行赋值 for i:=0; i<len(s); i++{ temp[i]=s[i] } return temp}[]byte -> stringfunc bytes2str(s原创 2020-08-31 10:23:40 · 614 阅读 · 0 评论 -
golang sync.WaitGroup使用
WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量,每一次执行Add都会增加线程组的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。方法介绍func (*WaitGroup) Add(delta int)Add方法向内部计数加上delta,delta可以是负数;如果内部计数器变为0,Wait方法阻塞等待的所有线程都会释放,如果计数器小于0,方法panic。注意Add加上正数的调用应在Wait之前,否则Wai原创 2020-08-30 13:48:59 · 416 阅读 · 0 评论 -
golang中设置默认值
golang并不像python,java等语言,在方法定义的时候可以提供默认值,不过我们可以通过其他的手段设置默认值比如说我们有一个可以结构体DouBanClient,可以往豆瓣中获取一些信息,由于豆瓣的一些限制,我们写爬虫的时候需要声明头部的User-Agent。创建一个client的时候,会有相应的参数,如果我们对这些参数不满意,那么我们可以自定义这些参数。下面代码的主要思路就是: 在调用创建对象的方法中,首先设置好默认参数,如果用户想要自定义,在传参的时候传入满足一定条件的参数,就可以修改我们已经原创 2020-08-30 11:06:43 · 8472 阅读 · 0 评论 -
golang 切片
Golang切片golang中的切片是一种数据结构,这种数据结构便于使用和管理数据集合。切片可以认为是动态数组,其大小可以按需动态的增大或者缩小。如果我们想扩充一个切片,可以使用append内置函数向切片中添加值如果我们想缩小一个切片,那么我们可以使用再切片的方式,对切片再次进行切片即可内部实现切片是一个很小的对象,对底层的数组进行了抽象,并且提供了相应的操作方法。切片主要有三个字段:指向底层数组的指针, 切片访问元素的个数, 切片允许增长到的元素个数创建和初始化1. 使用make函数//原创 2020-08-29 15:39:59 · 122 阅读 · 0 评论 -
golang中切片会导致整个底层数组被锁定,对内存造成极大的压力
在进行切片的时候,底层数据不会被复制,仍然会被切片所引用。比如说我们需要输出一个文件的前面10字节,我们使用下面的方式package main import ( "fmt" "io/ioutil")func main(){ filename := "data.csv" data, err := ioutil.ReadFile(filename) if err != nil{ fmt.Println(err) } header := data[:10] fmt.Println原创 2020-08-29 10:57:40 · 397 阅读 · 0 评论 -
fatal error: all goroutines are asleep - deadlock!
使用golang中的channel的时候,有时候会出现如下的报错:fatal error: all goroutines are asleep - deadlock!那么,引起该错误的原因是什么呢?报错中的信息提示我们,所有的goroutine都休眠了,也就是说没有goroutine在运行了,所以说,如果我们还在从channel中读取数据,但是没有其他的协程将数据放进channel中,那么我们读取了什么,根本就读不到!package main import ( "fmt")func ma原创 2020-08-29 10:32:04 · 470 阅读 · 0 评论 -
golang中设置正则表达式的标志
golang中支持多个匹配标志,比如I 大小写敏感(默认关闭)m ^和$在匹配文本开始和结尾之外,还可以匹配行首和行尾(默认开启)s 让.可以匹配\n(默认关闭)U 非贪婪的:交换x*和x*?、x+和x+?……的含义(默认关闭)在python等语言中可以直接在正则匹配的时候声明匹配时候的flag,比如python中的re.I,re.S等标志,但是对于golang来说,我们不能如此声明标志,而应原创 2020-08-26 18:39:46 · 801 阅读 · 0 评论 -
unsupported destination, should be slice or struct
某次如下使用gorm的时候出现以下的错误:DB.Model(&model.Captcha{}).Find(data)unsupported destination, should be slice or struct其实之前我使用过一样的方式写过代码,当时请求的时候是正确的,不过这次就????,一言难尽后来在stackoverflow上面问了这个问题,在这里总结一下使用结构体接收数据如果直接使用var data *structType 来定义变量接收数据,由于没有进行初始化,所以刚开原创 2020-08-23 13:01:09 · 4825 阅读 · 2 评论 -
golang中如何获取变量的类型?
在golang中并没有提供内置函数来获取变量的类型,但是通过一定的方式也可以获取,下面提供两种思路1. 通过格式化使用格式化字符%T(注意为大写的T)便可以获取到对应的类型package mainimport ( "fmt")func main(){ var v int = 64 fmt.Printf("v的值为: %v, v的类型为: %T\n", v, v) // 如果想要保存类型到字符串中,可以使用 typ := fmt.Sprintf("%T", v)}2. 通过反射原创 2020-08-16 09:47:17 · 5804 阅读 · 0 评论 -
golang使用encoding/csv对csv文件进行读取和写入
1. 读取csv文件package mainimport ( "fmt" "encoding/csv" "os" "io")func main(){ f, err := os.Open("data.csv") if err != nil{ fmt.Println("Error: ", err) return } reader := csv.NewReader(f) // 可以一次性读完 result, err := reader.ReadAll() i原创 2020-08-15 22:18:56 · 7599 阅读 · 0 评论 -
Golang 使用base64进行加解密
golang 中提供了两种base64加密的方式,一种是标准的base64加密,另外一种是用于URL和文件的base64加密,在标准库中使用的时候只不过是调用方式略有不同1. 标准base64加解密package mainimport ( "fmt" "encoding/base64")func main(){ // 进行加密 e := base64.StdEncoding.EncodeToString([]byte("hello")) fmt.Println(e) // 进行解密原创 2020-08-15 19:17:59 · 1735 阅读 · 0 评论 -
Go中的类型定义和类型别名
注意Go 1.9 之后才出现了类型别名相同点两种定义的方式均使用 type关键字不同点1. 定义方式不同类型定义方式如下:type NewType Type类型别名定义如下:type NewType = Type2. 本质不同类型定义相当于定义了一个全新的类型,与之前的类型不同,但是类型别名并没有定义一个新的类型,而是使用一个别名来替换之前的类型,就比如说一个人的乳名,虽然你的乳名和你的全名不同,但是实际上他们指的都是你下面的代码可以很明显的说明这一点:package main原创 2020-08-15 12:16:43 · 1222 阅读 · 0 评论