Go基础
GO语言相关
Just_do_do_IT
IT
展开
-
34 Go语言中使用JWT
package mainimport ( "errors" "fmt" "github.com/dgrijalva/jwt-go/v4" "time")/* JWT使用*/// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims// jwt包自带的jwt.StandardClaims只包含了官方字段// 我们这里需要额外记录一个username字段,所以要自定义结构体// 如果想要保存更多信息,都可以添加到这个结构体中type MyClaims s原创 2021-08-09 16:39:21 · 644 阅读 · 0 评论 -
golang中byte和runne 类型
简介golang中字符属于int类型,当我们直接输出 byte(字符)的时候输出的是这个字符对应的ASCII码值使用1. 直接输出值可以看见输出的是码值,类型int32package mainimport "fmt"func main() { var a = 'a' fmt.Printf("值:%v, 类型:%T\n", a, a)//值:97, 类型:int32 fmt.Printf("值:%c, 类型:%T\n", a, a)//值:a, 类型:int32}2. 输原创 2021-01-13 14:53:23 · 427 阅读 · 0 评论 -
Golang网络爬虫框架gocolly/colly
Golang网络爬虫框架gocolly/colly,具体内容连接:链接:Golang 网络爬虫框架gocolly/colly 1链接:Golang 网络爬虫框架gocolly/colly 2链接:Golang 网络爬虫框架gocolly/colly 3链接:Golang 网络爬虫框架gocolly/colly 4链接:Golang 网络爬虫框架gocolly/colly 5...原创 2021-01-01 23:05:51 · 413 阅读 · 0 评论 -
Go 结构体、数组、字典和 json 字符串的相互转换方法
Go 语言中 encoding/json包可以很方便的将结构体、数组、字典转换为 json 字符串。1. 相关语法1.1 引入import "encoding/json"1.2 解析语法// v 传入结构体、数组等实例变量// []byte 字节数组// error 可能会有的错误func Marshal(v interface{}) ([]byte, error)1.3 反解析// []byte 字节数组// v 传入结构体、数组等实例变量的指针地址// error 可能会.原创 2020-12-28 19:42:19 · 1009 阅读 · 0 评论 -
0. Go语言学习/Go语言教程
《Go语言学习》目录。一、开发环境准备1 安装Go及搭建Go开发环境2 Go跨平台编译3 Go依赖管理及go module使用4 使用Go module导入本地包二、Go语言基础5 Go语言基础之变量和常量6 Go语言基础之基本数据类型7 Go语言基础之运算符8 Go语言基础之流程控制9 Go语言基础之数组10 Go语言基础之切片11 Go语言切片排序算法(选择排序、冒泡排序、sort包排序)12 Go语言基础之map13 Go语言基础之函数14 Go语言基础之指针15 G原创 2020-12-09 08:58:25 · 303 阅读 · 0 评论 -
33. Go语言数据库操作之MongoDB
前言mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。33.1 mongoDB介绍mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。mongoDB中将一条数据存储为一个文档(document),数据结构由键值(key-value)对组成。 其中文档类似于我们平原创 2020-12-09 08:33:20 · 655 阅读 · 1 评论 -
32. Go语言数据库操作之Redis
前言在项目开发中redis的使用也比较频繁,本文介绍Go语言中go-redis库的基本使用。32.1 Redis简介Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。32.1.1 Redis支持的数据结构Redis支持诸如字符串(strings)、哈希(hashes)、列表(list原创 2020-12-09 08:12:28 · 663 阅读 · 2 评论 -
31. Go语言数据库操作之sqlx库使用
前言在项目中我们通常可能会使用database/sql连接MySQL数据库。本文借助使用sqlx实现批量插入数据的例子,介绍sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法。31.1 sqlx介绍在项目中我们通常可能会使用database/sql连接MySQL数据库。sqlx可以认为是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。这些扩展中除了大家常用来查询的Get(dest interface{}, ...) error原创 2020-12-09 08:12:02 · 915 阅读 · 0 评论 -
30. Go语言数据库操作之MySQL
前言MySQL是业界常用的关系型数据库,本文主要介绍Go语言如何操作MySQL数据库。30.1 连接Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。常用的数据库基本上都有完整的第三方实现。例如:MySQL驱动30.1.1 下载依赖go get -u github.com/go-sql-driver/mysql30.1.2 使用MySQL驱动func Open(driv原创 2020-12-09 08:11:47 · 353 阅读 · 0 评论 -
29. Go语言标准库之Context
前言在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。29.1 为什么需要Context2原创 2020-12-08 15:24:39 · 109 阅读 · 0 评论 -
28. Go语言标准库之net/http
前言Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。28.1 net/http介绍Go语言内置的net/http包提供了HTTP客户端和服务端的实现。28.1.1 HTTP协议超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。28.2 HTTP客户端28.2.1 基本的HTTP/HTT原创 2020-12-08 14:57:49 · 177 阅读 · 0 评论 -
27. Go语言标准库之strconv
前言Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi()、Itia()、parse系列、format系列、append系列。更多函数请查看官方文档。27.1 string与int类型转换这一组函数是平时编程中用的最多的。(1) Atoi()Atoi()函数用于将字符串类型的整数转换为int类型,函数签名如下:func Atoi(s string) (i int, err error)原创 2020-12-08 14:39:58 · 158 阅读 · 0 评论 -
26. Go语言标准库之文件操作
前言主要介绍Go语言中文件读写的相关操作。计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。26.1 打开和关闭文件os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。package mainimport ( "fmt" "os")func main() { // 只读方式打开当前目录下的main.go文件 file, err := os.Open("./main.go"原创 2020-12-08 14:22:32 · 217 阅读 · 0 评论 -
25. Go语言标准库之log包
前言无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。Go语言内置的log包实现了简单的日志服务。主要介绍标准库log的基本使用。25.1 使用Loggerlog包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Pa原创 2020-12-08 14:03:23 · 250 阅读 · 0 评论 -
24. Go语言标准库之flag包
前言Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。24.1 os.Args如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。package mainimport ( "fmt" "os")//os.Args demofunc main() { //os.Args是一个[]string if len(os.Args) > 0 { for index, arg := range os.Ar原创 2020-12-08 13:44:27 · 166 阅读 · 0 评论 -
23. Go语言标准库之time包
前言时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法。23.1 time包time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。23.1.1 时间类型time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。示例代码如下:func timeDemo() { now := time.Now() //获取当前时间 fmt.Printf("current time:%v\n", no原创 2020-12-08 13:32:59 · 202 阅读 · 0 评论 -
22. Go语言标准库之fmt与格式化占位符
前言fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数。22.1 fmtfmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。22.1.1 向外输出标准库fmt提供了以下几种输出相关函数。(1)PrintPrint系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。func Prin原创 2020-12-08 13:15:34 · 882 阅读 · 0 评论 -
21. Go语言基础之单元测试
前言不写测试的开发不是好程序员。我个人喜欢TDD(Test Driven Development)的,然而大部分的程序员都不太关注测试这一部分。 本文主要介绍下在Go语言中如何做单元测试和基准测试。21.1 go test工具Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被g原创 2020-12-08 11:28:11 · 228 阅读 · 0 评论 -
20. Go语言基础之网络编程
前言关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。20.1 互联网协议介绍互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里一概而全,只能介绍一下我们日常开发中接触较多的几个协议。20.1.1 互联网分层模型互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一原创 2020-12-08 10:14:18 · 212 阅读 · 0 评论 -
19. Go语言基础之并发
前言并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。19.1 并发与并行并发:同一时间段内执行多个任务(你在用微信和两个朋友聊天)。并行:同一时刻执行多个任务(你和你朋友都在用微信和朋友聊天)。Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。Go原创 2020-12-07 21:45:01 · 191 阅读 · 0 评论 -
18. Go语言基础之反射
前言本文介绍了Go语言反射的意义和基本使用。18.1 变量的内在机制Go语言中的变量是分为两部分的:类型信息:预先定义好的元信息。值信息:程序运行过程中可动态变化的18.2 反射介绍反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序原创 2020-12-07 20:05:21 · 171 阅读 · 0 评论 -
17. Go语言基础之接口
前言接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。17.1 接口17.1.1 接口类型在Go语言中接口(interface)是一种类型,一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。为了保护你的Go语言职业生涯,请牢记接口(interface)原创 2020-12-07 16:39:57 · 144 阅读 · 0 评论 -
16. Go语言的包(package)
前言在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。16.1 Go语言的包(package)16.1.1 包介绍包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io等。16.1.2 定义包我们还可以根据自己的需要创建自己的包。一个包可以简单理解为一个存放.go文件的文件夹。 该文件夹下面的所有go文件都要在代码的第一行添原创 2020-12-07 16:00:03 · 256 阅读 · 0 评论 -
15. Go语言基础之结构体
前言Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。15.1 类型别名和自定义类型15.1.1 自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型。自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如://将MyInt定义为int类型type MyInt int通过t原创 2020-12-07 15:41:48 · 276 阅读 · 0 评论 -
14. Go语言基础之指针
前言要搞明白Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。1. Go语言中的指针 任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)和*(根据地址取值)。1.1. 指针地址和指针类型每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量原创 2020-12-07 14:54:56 · 184 阅读 · 0 评论 -
13. Go语言基础之函数
前言函数是组织好的、可重复使用的、用于执行指定任务的代码块。Go语言中支持函数、匿名函数和闭包13.1 函数13.1.1 函数定义Go语言中定义函数使用func关键字,具体格式如下:func 函数名(参数)(返回值){ 函数体}其中:函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。返回值:返回值由返回值变量和其变量类型组成,也可以原创 2020-12-04 09:15:48 · 175 阅读 · 0 评论 -
12. Go语言基础之map
前言Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。12.1 map定义map的定义语法如下:map[KeyType]ValueType其中:KeyType:表示键的类型。ValueType:表示键对应的值的类型。map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:make(map[KeyType]ValueType, [原创 2020-12-04 09:15:30 · 317 阅读 · 0 评论 -
11. Go语言切片排序算法(选择排序、冒泡排序、sort包排序)
11.1 选择排序选择排序:进行从小到大排序概念:通过比较 首先选出最小的数放在第一个位置上,然后在其余的数中选出次小数放在第二个位置上以此类推。实例://选择排序(从大到小)func selectSort() { var numSlice = []int{8, 9, 5, 7, 6, 4} for i := 0; i < len(numSlice); i++ { for j := i+1; j <len(numSlice) ; j++ { if numSlice原创 2020-12-04 09:15:05 · 374 阅读 · 0 评论 -
10. Go语言基础之切片
前言主要介绍Go语言中切片(slice)及它的基本使用因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如:func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ sum = sum + v } return sum}这个求和函数只能接受[3]int类型,其他的都不支持。 再比如:a := [3]int{1, 2, 3}数组a中已经有三个元素了,我原创 2020-12-03 10:20:18 · 213 阅读 · 0 评论 -
9. Go语言基础之数组
前言Array(数组)数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法:// 定义一个长度为5元素类型为int的数组avar a [5]int9.1 数组定义var 数组变量名 [元素数量]T比如:var a [3]int, 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。 [3]int 和[5]int 是不同的类型。var a [2]intvar b [3]inta = b //原创 2020-12-03 10:15:01 · 157 阅读 · 0 评论 -
8. Go语言基础之流程控制
Go语言中最常用的流程控制有 if 和 for,而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。8.1 if else(分支结构)(1)if条件判断基本写法if 表达式1 { 分支1} else if 表达式2 { 分支2} else{ 分支3}当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。 if判断中的else if和else都是可选的,可以根据实际需.原创 2020-12-03 10:12:24 · 129 阅读 · 0 评论 -
7. Go语言基础之运算符
简介运算符用于在程序运行时执行数学或逻辑运算。Go 语言内置的运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符7.1 算数运算符运算符描述+相加-相减*相乘/相除%求余注意: ++(自增)和–(自减)在Go语言中是单独的语句,并不是运算符。7.2 关系运算符运算符描述==检查两个值是否相等,如果相等返回 True 否则返回 False。!=检查两个值是否不相等,如果不相等返回 T原创 2020-12-03 10:07:30 · 139 阅读 · 0 评论 -
6. Go语言基础之基本数据类型
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。Go 语言的基本类型和其他语言大同小异。6.1 基本数据类型6.1.1 整型整型分为以下两个大类:按长度分为:int8、int16、int32、int64对应的无符号整型:uint8、uint16、uint32、uint64其中,uint8就是我们熟知的byte型,int16对应Java中的short型,int64对应Java中的long型类.原创 2020-12-03 10:05:22 · 232 阅读 · 0 评论 -
5. Go语言基础之变量和常量
变量和常量是编程中必不可少的部分。5.1 标识符与关键字5.1.1 标识符在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和__(下划线)组成,并且只能以字母和_开头。 举几个例子:abc、 _、 _123、 a123。5.1.2 关键字关键字是指编程语言中预先定义好的具有特殊含义的标识符。 关键字和保留字都不建议用作变量名。Go语言中有25个关键字:break default func .原创 2020-12-03 10:01:43 · 197 阅读 · 0 评论 -
4. 使用Go module导入本地包
前言假设我们现在有moduledemo和mypackage两个包,其中moduledemo包中会导入mypackage包并使用它的New方法。mypackage/mypackage.go内容如下:package mypackageimport "fmt"func New(){ fmt.Println("mypackage.New")}现在分两种情况讨论:(1)同一个项目;(2)不同项目;4.1. 同一个项目下注意: 在一个项目(project)下我们是可以定义多个包(packag原创 2020-12-03 09:55:43 · 393 阅读 · 0 评论 -
3. Go依赖管理及go module使用
3.1 简介为什么需要依赖管理:最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?Go语言从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等。godep是一个通过vender模式实现的Go语言的第三方依赖管理工具,类似的还有由社区维护准官方包管理工具dep。3.2 godep 管理工具(1)原创 2020-12-03 09:48:36 · 291 阅读 · 0 评论 -
2. Go跨平台编译
2.1 跨平台编译默认go build的可执行文件都是当前操作系统可执行的文件,如果想在windows下编译一个linux下可执行文件,只需要指定目标操作系统的平台和处理器架构即可。Windows下编译Linux平台 可执行程序:SET CGO_ENABLED=0 // 禁用CGOSET GOOS=linux // 目标平台是linuxSET GOARCH=amd64 // 目标处理器架构是amd64使用了cgo的代码是不支持跨平台编译的然后再执行go build命令,得到的原创 2020-12-03 09:43:26 · 570 阅读 · 0 评论 -
1. 安装Go及搭建Go开发环境
1.安装Go及搭建Go开发环境1. 安装Go及搭建Go开发环境1.安装Go及搭建Go开发环境**注意:**Go语言1.14版本之后推荐使用go modules管理以来,也不再需要把代码写在GOPATH目录下了。无需手动配置环境变量,使用go mod 管理项目,项目可以在任意位置。1.1 下载地址Go官网下载地址:https://golang.org/dl/Go官方镜像站(推荐):https://golang.google.cn/dl/1.2 安装1.2.1 Windows安装将上一步选好的原创 2020-12-03 09:23:58 · 239 阅读 · 0 评论