![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go基础
go基础语法
来自万古的忧伤
努力,勿让自己继续活在后悔中
展开
-
go mod 使用私有gitlab群组的解决方案
如果使用gitlab 的仓库作为go mode 私有库 ,会遇到go mod tidy会报错说gitlab 仓库会有问题拉不下来我们需要配置gitlab的https为sshgit config --global url."git@gitlab.com:".insteadOf https://gitlab.com/也可以获取具体的分支在go mod修改replace gitlab.com/YourGroup/SubGroup/Project => gitlab.com/YourGroup原创 2022-05-24 20:06:03 · 986 阅读 · 1 评论 -
Gin框架提供Protobuf作为通信协议
Gin框架提供Protobbuf作为通信协议原创 2022-02-13 11:48:27 · 1274 阅读 · 0 评论 -
Grpc之metadata与拦截器
一 metadatagRPC让我们可以像本地调用一样实现远程调用,对于每一次的RPC调用中,都可能会有一些有用的数据,而这些数据就可以通过metadata来传递。metadata是以key-value的形式存储数据的,其中key是string类型,而value是[]string,即一个字符串数组类型。metadata使得client和server能够为对方提供关于本次调用的一些信息,就像一次http请求的RequestHeader和ResponseHeader一样。http中header的生命周周期是一次原创 2022-01-06 11:53:42 · 1372 阅读 · 1 评论 -
Grpc之流模式
一 流模式简介RPC是远程函数调用,因此每次调用的函数参数和返回值不能太大,否则将严重影响每次调用的响应时间。因此传统的RPC方法调用对于上传和下载较大数据量场景并不适合。同时传统RPC模式也不适用于对时间不确定的订阅和发布模式。为此,gRPC框架针对服务器端和客户端分别提供了流特性。//hello.protosyntax = "proto3";option go_package = "./;proto";service StreamService{ // 关键字stream指定启用流特原创 2021-12-30 11:20:43 · 1235 阅读 · 0 评论 -
go-grpc 入门
gRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架。gRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。本节将讲述gRPC的简单用法。一 GRPCGo语言的gRPC技术栈如图4-1所示:最底层为TCP或Unix Socket协议,在此之上是HTTP/2协议的实现,然后在HTTP/2协议之上又构建了针对Go语言的gRPC核心库。应用程序通过gRPC插件生产的Stub代码和gRPC核心库通信,也可以直接和gRPC核心库通信。二 .原创 2021-12-24 11:36:54 · 747 阅读 · 0 评论 -
Protobuf语法详解
参考资料https://www.yuque.com/daxiongmao-u2ys1/bw474f/lzyn65官网网址 https://developers.google.com/protocol-buffers/docs/proto3一 定义一个消息类型先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了:syntax = "proto3";.原创 2021-12-15 18:24:40 · 1257 阅读 · 0 评论 -
Go之rpc入门
参考资料 GO高级编程一 Rpc入门RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC已经和IPC一样成为一个不可或缺的基础构件。因此Go语言的标准库也提供了一个简单的RPC实现,我们将以此为入口学习RPC的各种用法。1.简单示例Go语言的RPC包的路径为net/rpc,也就是放在了net包目录下面。因此我们可以猜测该RPC包是建立在net包基础之上的。在第一章“Hello, World”革命一节最后,我们基于http实现了一个打印例子。下面我们尝试基于rp.原创 2021-11-29 17:14:50 · 3831 阅读 · 0 评论 -
go调用gitlabapi
这里只介绍一些api的使用方式 不一定全面一 背景介绍gitlab的api分为v3 和v4 godoc的一些包 只支持v4 但是v3的不支持所以自己写了一些简单的调用 还需要继续封装gitlab api地址https://docs.gitlab.com/ee/api///获取项目列表//main.gopackage mainimport ( "fmt" "log" . "ali/gitlab/v4")func main() { method := "GET" g :=.原创 2021-01-23 10:48:49 · 2212 阅读 · 0 评论 -
Go的异常退出场景
go程序异常painc 退出的场景引用书籍《Go语言编程之旅》1.因为数组/切片索引越界package mainimport "fmt"func main() { names := []string{ "test", "test2", } name := names[len(names)] fmt.Println(name)}2.空指针调用package mainimport "fmt"type User struct { name string}.原创 2020-09-16 18:56:33 · 860 阅读 · 0 评论 -
GO之defer与return的执行顺序
参考https://www.cnblogs.com/saryli/p/11371912.html多个defer的执行顺序为“后进先出”;defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。如果函数的返回值是无名的(不带命名返回值),则go语言会在执行return的时候会执行一个类似创建一个临时变量作为保存return值的动作,而有名返回值的函数,由于返回值在函数定义的时候已经将该原创 2020-08-22 11:23:54 · 4395 阅读 · 5 评论 -
二十四、WEB开发
1.HTML常用标签注释 标题 h1~h6段落 p超链接 a图片 img表单 forminput: text/password/radio/checkbox/file/date/datetime/url/submit/hiddentextareaselect/option按钮 button表格 table/thead/tbody/tr/td/th列表 ol/ul/li块...原创 2020-03-31 16:44:38 · 402 阅读 · 0 评论 -
Go练习题(11)
net包练习//server.gopackage mainimport ( "bufio" "fmt" "io/ioutil" "net" "os" "path/filepath" "strings")//这里的独写用的是小文件 如果文件较大适合用bufio 或者read 分批次字节切片读取var ( binPath string dirPath string ...原创 2020-03-31 15:38:32 · 239 阅读 · 1 评论 -
Go练习题(10)
点对点聊天v1版本//server.gopackage mainimport ( "fmt" "net" "time")func main() { addr := "0.0.0.0:9999" listener,err := net.Listen("tcp",addr) if err != nil { fmt.Println(err) } fmt.Println...原创 2020-03-31 15:31:47 · 296 阅读 · 0 评论 -
二十三、管道
在go语言中可以通过chan来定义管道,可以通过操作符<-和->对管道进行读取和写入操作通过管道维护例程状态:1.读写管道(声明&赋值&操作)使用make函数初始化,make(chan type)/make(chan type, len),不带len参数的用于创建无缓存区的管道,使用len创建指定缓冲区长度的管道读写管道可通过操作符<-和->对管道...原创 2020-03-31 15:25:58 · 208 阅读 · 0 评论 -
二十二、并发编程
1.并发编程基本概念并发编程开发将一个过程按照并行算法拆分为多个可以独立执行的代码块,从而充分利用多核和多处理器提高系统吞吐率顺序、并发与并行顺序是指发起执行的程序只能有一个并发是指同时发起执行(同时处理)的程序可以有多个(单车道并排只能有一辆车,可同时驶入路段多辆车)并行是指同时执行(同时做)的程序可以有多个 (多车道并排可以有多个车)2.例程Go语言中每个并发执行的单元叫Goro...原创 2020-03-31 15:22:07 · 111 阅读 · 0 评论 -
Go练习题(9)
在之前的用户管理的基础上使用Json做持久化目录节构都一致方法一://main.gopackage mainimport ( "fmt" "github.com/strive-after/users/lib")func main() { var ( user string menu string ) if !lib.Auth() { fmt.Println...原创 2020-03-21 14:25:21 · 253 阅读 · 0 评论 -
二十一、Json
1.介绍在内存数据进行持久化存储或网络交换时常可采用 json 格式字符串,go 语言提供 json包进行 json 序列化和反序列化对于 Go 提供的基本类型和符合类型可以直接使用 json 包进行序列化和反序列化操作,针对结构体可通过标签声明属性和 json 字符串的转换关系,标签名为 json,常用格式为:⚫ json:默认形式,可省略,json 键名使用属性名,类型通过属性对...原创 2020-03-21 14:15:21 · 329 阅读 · 0 评论 -
二十、接口的应用示例(便于理解使用场景)
多云平台 或者不同平台的服务器信息 操作相同只是平台不同 就可以用接口来做package mainimport ( "fmt")type Cloud interface { GetHost() []Host Start(id string) error Stop(id string) error Detil(id string) error}type Host stru...原创 2020-03-21 14:06:06 · 335 阅读 · 0 评论 -
二十、接口
1.声明&定义&赋值&断言&判断(1)定义接口定义使用 interface 标识,声明了一系列的函数签名 (函数名、函数参数、函数返回值), 在定义接口时可以指定接口名称,在后续声明接口变量时使用(2)声明声明接口变量只需要定义变量类型为接口名,此时变量被初始化为 nil(3)赋值类型对象当自定义类型实现了接口类型中声明的所有函数时,则该类型的对象可以...原创 2020-03-21 14:04:42 · 237 阅读 · 0 评论 -
Go练习题(8-2)
8-1是使用函数 这里使用方法1.用户数据持久化 gob csv 密码也持久化 每次操作完持久化 User不能有全局的 每次需要用User 从文件反序列化2.当文件不存在,获取反序列化失败,不能报错3.密码文件不存在 让用户初始化密码3.保存文件 加一个版本 数据文件每次保存一个版本 最多保留3个版本4.修改密码(输入原密码和新密码 只有在原密码正确的时候 新密码持久化)1....原创 2020-03-21 13:46:47 · 173 阅读 · 0 评论 -
Go练习题(8-1)
V1 使用函数来解决需求需求(在之前的用户管理的基础上)1.用户数据持久化 gob csv 密码也持久化 每次操作完持久化 User不能有全局的 每次需要用User 从文件反序列化2.当文件不存在,获取反序列化失败,不能报错3.密码文件不存在 让用户初始化密码3.保存文件 加一个版本 数据文件每次保存一个版本 最多保留3个版本4.修改密码(输入原密码和新密码 只有在原密码正确...原创 2020-03-21 12:55:27 · 232 阅读 · 0 评论 -
G练习题(7)
实现目录的复制(copy)package mainimport ( "bufio" "flag" "fmt" "io" "io/ioutil" "os" "path/filepath")func copyfile(src,desc string) { srcfile,err := os.Open(src) if err != nil { fmt.Println(e...原创 2020-03-21 12:36:28 · 193 阅读 · 0 评论 -
Go练习题(6)
1.copy文件(1)小文件package mainimport ( "flag" "fmt" "io/ioutil" "os")func copyfile(src,desc string) { srcfile,err := os.Open(src) if err != nil { fmt.Println(err) } else { defer srcfile....原创 2020-03-19 11:26:44 · 257 阅读 · 0 评论 -
十九、Strings/Bytes
1.Stringsstrings 包提供操作 UTF-8 字符串常用函数和结构体a) 常用函数⚫ Compare:比较字符串⚫ Contains:是否包含子字符串⚫ Count:子字符串出现次数⚫ EqualFold:不区分大小写比较⚫ Fields:按空白字符分割字符串⚫ HasPrefix:是否以字符串作为前缀⚫ HasSuffix:是否以字符串作为后缀⚫ Index:获取...原创 2020-03-19 11:17:46 · 187 阅读 · 0 评论 -
十八、文件持久化(CSV&GOB)
1.CSVencoding/csv 包提供对 csv 文件读写的操作a) 常用结构体⚫ Reader常用函数➢ NewReader常用方法➢ Read➢ ReadAll⚫ Writer常用函数➢ NewWriter常用方法➢ Write➢ WriteAll➢ Flush(1)Csvreaderpackage mainimport ( "encoding/...原创 2020-03-19 11:15:41 · 309 阅读 · 0 评论 -
十七、带缓冲的IO
1.简介bufio 包提供缓冲流的功能a) 常用结构体⚫ Reader常用函数➢ NewReader:创建缓冲输入流常用方法➢ Read:读取数据到切片中➢ ReadLine:读取一行内容到字节切片中➢ ReadSlice:根据分隔符读取数据到字节切片➢ ReadString:根据分隔符读取数据到字符串➢ Reset:重设缓冲流➢ WriteTo:将数据写入到输出流⚫Sc...原创 2020-03-19 11:13:53 · 189 阅读 · 0 评论 -
十六、工具方法(io/ioutil&path/filepath)
1.io/ioutilioutil 包主要提供对流的实用操作功能a) 常用函数⚫ ReadAll:读取流中所有内容⚫ ReadDir:读取目录中文件信息⚫ ReadFile:读取文件⚫ TempDir:创建临时目录⚫ TempFile:创建临时文件⚫ WriteFile:写入文件package mainimport ( "fmt" "io/ioutil" "...原创 2020-03-19 11:12:11 · 273 阅读 · 0 评论 -
十五、标准输入输出
package mainimport (“bufio”“fmt”“os”)func main() {//os.Stdin//os.Stdoutfmt.Println(“xxx”)os.Stdout.Write([]byte(“xxx”))bytes := make([]byte,10)n,err := os.Stdin.Read(bytes)fmt.Println(n,e...原创 2020-03-19 11:10:20 · 207 阅读 · 0 评论 -
十四、目录操作
1.创建&删除&重命名package mainimport "os"func main() { //创建目录 //这里有个返回值 如果文件夹存在 会返回一个报错 os.Mkdir("test01",0644) //重命名 os.Rename("test01","test02") //删除 os.Remove("test02")...原创 2020-03-19 11:09:34 · 130 阅读 · 0 评论 -
十三、文件操作
os 包提供了对文件、系统和进程的操作函数a) 文件操作常用常量:⚫ Stdin⚫ Stdout⚫ Stderr⚫ ModePerm:0777常用函数:⚫ Chmod:修改文件权限⚫ Chown:修改文件所属用户,用户组⚫ Chtimes:修改文件访问时间和修改时间⚫ IsExist:与 os.Stat 一起用于判断文件存在⚫ IsNotExist:与 os.Stat 一起...原创 2020-03-19 11:08:16 · 636 阅读 · 0 评论 -
Go练习题(5)
针对练习题4做出一些功能添加1.用户管理用户修改为struct,并且针对属性使用不同数据类型ID intName stringbirthday time.timetel stringaddr stringdesc string注意进行类型转换2.添加修改数据的时候对用户名进行检验,用户名不能为空,且用户名必须唯一a.添加用户b.在添加用户 不能添加(用户名已存在)c.修...原创 2020-03-17 16:13:40 · 240 阅读 · 0 评论 -
十二、方法
方法是为特定类型定义的,只能由该类型调用的函数1.定义&调用package mainimport ( "fmt")type Dog struct { Name string}//方法是为特定类型定义的,只能由该类型调用的函数//方法是添加了接收者的函数,接收者必须是自定义的类型func (dog Dog) Call() { fmt.Printf("...原创 2020-03-17 14:56:23 · 146 阅读 · 0 评论 -
十一、结构体可见性以及构造函数
1.可见性结构体首字母大写则包外可见(公开的),否者仅包内可访问(内部的)结构体属性名首字母大写包外可见(公开的),否者仅包内可访问(内部的)组合:⚫ 结构体名首字母大写,属性名大写:结构体可在包外使用,且访问其大写的属性名⚫ 结构体名首字母大写,属性名小写:结构体可在包外使用,且不能访问其小写的属性名⚫ 结构体名首字母小写,属性名大写:结构体只能在包内使用,属性访问在结构体嵌入时由...原创 2020-03-17 14:53:32 · 311 阅读 · 0 评论 -
十一、结构体嵌入
1.命名嵌入结构体命名嵌入是指结构体中的属性对应的类型也是结构体package mainimport "fmt"type Addrs struct { Region string Street string}type Users struct { ID int Name string Addr Addrs}func main() { ...原创 2020-03-17 14:50:55 · 544 阅读 · 0 评论 -
十一、结构体(基础)
1.自定义类型package mainimport "fmt"type Counter inttype users map[string]stringtype Callback func(...string)//后面可以跟任意类型func main() { var age Counter fmt.Println(age) age = 200 fmt.Pri...原创 2020-03-17 14:44:29 · 107 阅读 · 0 评论 -
Go练习题(4)
在练习题3的基础上//一个用户管理系统/*需要提供的功能1.添加用户2.删除用户3.修改用户信息4.查询用户信息*/1.创建module用户管理放子包中2.密码明文,命令行输入明文密码输入 gopass代码的密码用md5 并在验证时计算md5值进行比较使用go mod包管理 目录结构为go mod init users//main.gopackage main...原创 2020-03-17 13:43:52 · 167 阅读 · 0 评论 -
十、单元测试与基准测试
Go 提供了 test 工具用于代码的单元测试,test 工具会查找包下以_test.go 结尾的文件,调用测试文件中以 Test 或 Benchmark 开头的函数并给出运行结果单元测试指的是功能测试基准测试指的是性能测试1. Test 函数测试函数需要导入 testing 包,并定义以 Test 开头的函数,参数为 testing.T 指针类型,在测试函数中调用函数进行返回值测试,...原创 2020-03-13 19:34:54 · 403 阅读 · 0 评论 -
九、包
包是函数和数据的集合,将有相关特性的函数和数据放在统一的文件/目录进行管理,每个包都可以作为独立的单元维护并提供给其他项目进行使用1. 声明Go 源文件都需要在开头使用 package 声明所在包,包名告知编译器哪些是包的源代码用于编译库文件,其次包名用于限制包内成员对外的可见性,最后包名用于在包外对公开成员的 访问 包名使用简短的小写字母,常与所在目录名保持一致,一个包中可以由多个 Go...原创 2020-03-13 19:32:24 · 247 阅读 · 0 评论 -
Go练习题(3)——第二种方法
//一个用户管理系统/*需要提供的功能1.添加用户2.删除用户3.修改用户信息4.查询用户信息*/package mainimport ( "fmt" "os" "strconv" "strings")//定义密码输入次数const ( password string = "123123" maxauth int = 3)//使用系统前输入密码 ...原创 2020-03-10 23:50:45 · 154 阅读 · 0 评论 -
Go练习题(3)——第一种方法
//一个用户管理系统/*需要提供的功能1.添加用户2.删除用户3.修改用户信息4.查询用户信息*/package mainimport ( "fmt" "strconv" "strings")//定义密码输入次数const ( password string = "123123" maxauth int = 3)//使用系统前输入密码 超过3次则退...原创 2020-03-10 23:43:32 · 209 阅读 · 0 评论