
Golang
文章平均质量分 80
Wang's Blog
Keep learning for the innovation era.
展开
-
Go微服务: 基于GRPC结合Consul实现微服务调用
刷新发现 127.0.0.1:8500 这个 consul 注册中心面板出来了一个新的服务。以上的调用,可以进行适当的封装来满足不同业务的调用,仅供演示。主要关注 main 函数中,注册consul服务相关代码。当然结合数据库操作封装功能完成闭环调用,不再赘述。新建 demo/server/main.go。新建 demo/client/main.go。发现服务端,客户端控制台都打印输出出来了。在 demo/client 下执行 $原创 2024-03-11 22:12:50 · 1017 阅读 · 3 评论 -
Go微服务: 基于Go Micro框架实现微服务调用
在具体的项目开发过程中,开发者聚焦的是业务逻辑的开发和功能的实现大量的环境配置,调试搭建等基础性工作会耗费相当一部分的精力因此有必要将微服务架构中所涉及到的,相关的解决方案做集中管理和维护Go Micro 帮助我们解决了大部分上述问题,它是一个简化分布式开发的微服务生态系统该系统为开发分布式应用程序提供了高效,便捷的模块构建, 主要目的是简化分布式系统的开发它默认实现了consul 作为服务发现,通过http进行通信,通过protobuf和json进行编解码原创 2024-03-10 22:11:45 · 1598 阅读 · 2 评论 -
Go微服务: 基于ProtoBuf实现GRPC的微服务调用
运行起来这个客户端,即可看到客户端打印出来的服务端回复信息,同时服务端自身也打印出来了。新建 demo/server/main.go。新建 demo/client/main.go。原创 2024-03-10 13:41:19 · 1047 阅读 · 0 评论 -
Go微服务: 基于ProtoBuf实现序列化和反序列化
关于 protoBuf 参考:选择合适的版本安装后注意检查环境变量安装后,查看版本本机安装 protobuf的件protoc-gen-go插件和protoc-gen-go-grpc插件这个插件把 protobuf 文件转化为 go 文件目前这个 protoc-gen-go 插件包安装可能会有问题,跟随我的步骤来解决这个包按照上述命令安装后,不会在, 则进行检查 go env 中的GOBIN查看 $go env,看下GOBIN是否为 “”, 如果如此,则进行设置,类似。原创 2024-03-09 15:42:04 · 911 阅读 · 0 评论 -
Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用
Golang 提供库来实现rpc方法采用 json 方式进行数据编解码,支持跨语言调用这里演示了,基于go语言为服务端,nodejs 和 golang 为客户端的3种示范注意,上面 nodejs版本中的 params 的格式与 golang 中的区别标准库的RPC默认采用Go语言特有的gob编码,没法实现跨语言调用golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。原创 2024-03-08 17:17:39 · 1347 阅读 · 0 评论 -
Go微服务:基于net/rpc模块实现微服务远程调用
这里在 client 项目目录中,新建一个 main.go 文件。编辑 client/main.go 文件。新建 client 目录,后执行 $2 )添加客户端退出时的关闭连接处理。1 )要连接的话,首先要建立连接。原创 2024-03-07 21:44:50 · 842 阅读 · 0 评论 -
Gin框架: 使用go-ini配置参数与不同环境下的配置部署
新建配置文件 conf/app.ini。在 main.go 文件中测试核心代码。下面是 main.go 中的读取示例。原创 2024-02-21 16:32:51 · 1201 阅读 · 0 评论 -
Gin框架: Cookie和Session在单体架构和分布式架构下的应用
2 ) 路由和控制器同上面的 cookie based session 示例,这里不再赘述。然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站。设置cookie时,设置了两个不同过期时间的cookie。可以让我们用同一个浏览器访问同一个域名的时候共享数据。2 )基于 cookie 的 session 技术。cookie 是存储于访问者计算机的浏览器中。1 ) 单单使用 cookie 的限制。每一次的访问,都是没有任何关系的。所以,cookie的功能。原创 2024-02-21 15:03:57 · 1289 阅读 · 0 评论 -
Gin框架: 通用方法的封装与上传功能的应用
注意了,这个之前的项目中,首页模板修改成 tpls/web/home/index.html 就不会有问题了 (这个可忽略,因为不涉及)在上传多张图片中又分为,同一文件字段和不同文件字段的处理。web首页模板 tpls/web/index.html。这里上传分多种场景:上传单张图片,上传多张图片。2 ) main 文件中对上传路径和模板的处理。3 )HTML 模板文件处理。main.go 主程序。5 ) 聊聊注意事项。原创 2024-02-20 23:16:31 · 791 阅读 · 0 评论 -
Gin框架: 控制器, 中间件的分层设计案例
以上就是对控制器的一般文件拆分和继承关系的调用示例,验证如下。改造 routers/adminRouters.go 文件。以上均可正常访问,这样就可以最快完成一个项目的拆分。这里 middlewares/init.go。5 ) controller 配置。这里使用最顶层控制器拆分时用的结构。1 ) 基础用法, 单一中间件。2 )主程序 main.go。3 ) HTML模板目录配置。4 ) routers 配置。被访问时都会经过这个中间件。1 )设计项目目录结构。2 )多个路由中间件。原创 2024-02-20 15:36:21 · 967 阅读 · 0 评论 -
Gin框架: 路由解析与分组详解
参数获取, 表单处理和路由分组原创 2024-02-20 12:12:01 · 1147 阅读 · 0 评论 -
Gin框架: HTML模板渲染之配置与语法详解
配置模板目录,在与main.go同级下, 新建目录 tpls, 在内部再创建两个目录: web, admin。配置模板目录,在与main.go同级下, 新建目录,下面二选一,仅作举例, 这里选择 tpls。在 预定义函数 中,执行模板时,函数从两个函数字典中查找。common/page_header.html模板。common/page_footer.html模板。新建 tpls/admin/news.html。在嵌套 template中,注意最后的点(.)在 tpls 目录下新建 news.html。原创 2024-02-19 21:12:32 · 1973 阅读 · 0 评论 -
Gin框架: 快速搭建起一个Web应用环境及处理不同类型的响应
Gin是Golang应用最为广泛的框架之一Gin是轻量级http web框架,简易而高性能,专注于处理高并发场景。原创 2024-02-18 12:49:04 · 843 阅读 · 0 评论 -
Go语言中的init函数的执行时机
先执行pkg1的init,因为在main中被最先引入,优先按照import的顺序执行,接着是pkg3的init, 接着是pkg2的init。因为 pkg3被pkg2引用,这样pkg3的init优先于pkg2的init执行。测试 同一个 Go 文件可以重复定义多个 init 方法。2.1 测试同一个包中,不同的文件中的init执行顺序。最后是main包中的init和main函数的方法。测试 导入不同的包有和没有依赖其他包的情况。原创 2024-01-06 19:15:02 · 1209 阅读 · 0 评论 -
Go语言中使用工作区模式解决私有包不方便调试的问题
实际上,并没有在我们的gitlab平台上创建这样一个仓库,这个时候,我们拉取这个包,是拉取不到的。现在不通过上传这个包的情况下,在project项目中,使用这个包内的属性或方法。在开发私有包的时候,就可以使用这个 workspace 目录在本地开发完之后。可以在 gowork 所在的目录,也就是我们这个 workspace目录。之后,在当前目录下,为我们生成一个 go.work 的文件, 内容如下。在 workspace 目录下初始化一个工作区 $在实际项目中,多个模块之间,可能还存在其他的依赖。原创 2024-01-06 18:31:26 · 710 阅读 · 0 评论 -
Go语言中支持的internal目录配置与组织内私网包配置详解
所以只要跨越了一个父目录,就没办法使用 internal 下面的开的程序实体。实际工作中,只需要配置 GOPROXY 和 GOPRIVATE。如果跨了一层目录,也就是 internal 父目录的父目录。如上结构,在 internal 目录中有 d包和e包。2 )第二种方式: 通过私有仓库的方式来导入。1 )第一种方式: 通过本地包的方式导入。原创 2023-12-30 16:52:38 · 1842 阅读 · 0 评论 -
Go语言中关于go get, go install, go build, go run指令
Go语言中关于go get, go install, go build指令原创 2023-12-29 22:06:54 · 879 阅读 · 0 评论 -
Go语言中的包管理工具之Go Modules的使用
需要注意的是,同一个模块版本的数据只会缓存一份。那所有其他模块呢都会共享使用。如果你希望清除当前已经缓存的模块的版本数据,可以执行这个 $5 ) 关于 go.mod 和 go.sum。6 ) go.mod 和 go.sum 对比。2 ) Go Modules 用法。3 ) go mod 的具体用法。8 ) 依赖包的存储对比。7 )关闭依赖包校验。原创 2023-12-29 21:32:06 · 1481 阅读 · 0 评论 -
Go语言中的包管理工具之Go Vendor的使用
在2015年的时候,我们的另一个包管理工具Go Vendor就诞生了,它诞生于 2015.8.19 ,是在Go的 1.5 版本当中引入的,它默认是关闭的原创 2023-12-29 12:48:17 · 1495 阅读 · 0 评论 -
Go语言中的包管理工具之Go Path的使用
我们先来看看go语言,刚发布阶段,是怎么去做包管理的, 在go语言的发布阶段,主要是通过 Go Path 模式来进行包管理, Go Path 是最早的依赖包管理方式。从 2009.11.10 随着第一个发布的第一个开源版本就有了, Go Path本质上它不算是go的包管理工具,它只是提供了一个存放包的路径的一个环境变量原创 2023-12-28 23:27:44 · 1456 阅读 · 1 评论 -
Fix cannot find package "golang.org/x/text/unicode/norm"
和上文类似,同样是在安装bleve这款全文搜索引擎上出现的问题。编译错误信息cannot find package "golang.org/x/text/unicode/norm" in any of:/Users/.../projects/go-projects/src/github.com/blevesearch/bleve/vendor/golang.org/x/text/unicode/原创 2017-08-26 23:34:01 · 4587 阅读 · 0 评论 -
Go语言学习笔记 --- reflection
reflection反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地反射使用TypeOf 和 ValueOf 函数从接口中获取目标对象信息反射会将匿名字段作为独立字段(匿名字段本质)想要利用反射修改对象状态,前提是interface.data 是settable, 即 pointer-interface通过反射可以”动态调用方法”示例代码:package main原创 2017-08-18 23:00:29 · 484 阅读 · 0 评论 -
Go语言学习笔记 --- concurrency、channel、select
Concurrency很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已。不过话说回来,每个实例 4-5KB 的栈内存占用和由于实现机制而大幅减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因。另外,goroutine 的简单易用,也在语言层面上给予了开发者巨大的便利。并发不是并行:Concurren原创 2017-08-19 23:18:29 · 870 阅读 · 0 评论 -
Go语言学习笔记 --- 关键字、注释、结构、包相关和可见性规则
Go 内置关键字 (25个均为小写) break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import returnGo 的注释方法// : 单行原创 2017-07-26 23:25:19 · 2593 阅读 · 0 评论 -
Go语言学习笔记 --- 常量、变量、批量定义与声明、数据类型、类型别名、类型转换
学习笔记根据 无闻 go语言基础教程 整理批量定义常量const ( PI = 3.14 c1 = 1 c2 = 2 c3 = 3)其中大写的外部可调用,小写的不可调用批量定义变量var ( name = "n1" age = 10)批量声明一般类型type( newType int ...原创 2017-07-30 15:14:25 · 3709 阅读 · 0 评论 -
Go语言学习笔记 --- 常量的定义详解
常量的定义常量的值在编译时就已经确定常量的定义格式与变量基本相同等号右侧必须是常量或者常量的表达式常量的表达式中的函数必须是内置函数示例:import ()const a int = 1const b = 'A'const ( c = a d = a + 1 e = a * 2)const f,g,h = 1, "2" ,'t'常量的初始化规则与枚举在定义常原创 2017-07-30 16:31:45 · 1221 阅读 · 0 评论 -
Go语言学习笔记 --- 运算符
Go 中的运算符Go 中的运算符都是从左到右的优先级 (从高到低)一元运算符: ^ !二元运算符: \* / % > & &^\+ - | ^== != < = >原创 2017-07-30 18:13:28 · 1257 阅读 · 0 评论 -
Go语言学习笔记 --- 指针和自增自减运算及相关注意事项
指针Go中不支持指针运算以及 -> 运算符,而直接采用 . 选择符来操作指针目标对象成员操作符 & 取变量地址,使用 * 通过指针间接访问目标对象默认值为nil 而非 NULL示例代码:a := 1 // 定义一个int型的avar p *int = &a // 此处说明: p 是一个指向int型的指针,指向的是a的地址fmt.Println(*p) // 1 // 使用*p的形式输出地原创 2017-08-02 23:39:29 · 9995 阅读 · 4 评论 -
Go语言学习笔记 --- 控制语句之if判断,循环语句for, switch语句和跳转语句
判断语句if条件表达式没有括号支持一个初始化表达式 (可以并行方式)做大括号必须和条件语句或else在同一行支持单行模式初始化语句中的变量为block级别,同时隐藏外部同名变量示例代码: package main import ( "fmt" ) func main() { test1() test2() test3() test4()原创 2017-08-03 00:05:33 · 2165 阅读 · 0 评论 -
Go语言学习笔记 --- 数组的使用
数组定义数组的格式: var [n] ,前提:n >= 0数组程度也是类型的一部分,因此具有不同长度的数组为不同类型注意区分指向数组的指针和指针数组数组在Go中为值类型数组之间可以使用 == 或 != 进行比较,但不能比较大小可以使用new来穿件数组,此方法返回一个指向数组的指针Go 支持多维数组示例代码:package mainimport ( "fmt")func原创 2017-08-06 21:37:28 · 606 阅读 · 0 评论 -
Go语言学习笔记 --- slice切片
slice切片其本身并不是数组,它指向底层的数组作为变长数组的替代方案,可以关联底层数组的局部或全部类型为引用类型可以直接创建或从底层数组获取生成使用len() 获取元素个数, cap() 获取容量一般使用make() 创建如果多个slice指向相同底层数组,其中一个的值改变会影响全部make([]T,len,cap)其中cap可以省略,则和len的值相同len表示存数的元素个数原创 2017-08-07 23:39:28 · 590 阅读 · 0 评论 -
Go语言学习笔记 --- map
map类似其他语言中的哈希表或字典,以key-value的形式存储数据key必须是支持==或!=比较运算的类型,不可以是函数、map或slicemap查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍map使用make() 创建,支持:=这种简写方式。make([keyType]valueType,cap), cap表示容量,可省略。超出容量时会自动扩容,但尽量提供一个合理的初始原创 2017-08-12 19:36:23 · 494 阅读 · 0 评论 -
Go语言学习笔记 --- function
functionGo 函数不支持嵌套、重载和默认参数支持:无需声明原型、不定长度变参、多返回值、命名返回值参数、匿名函数、闭包定义函数使用关键字func,且左大括号不能另起一行函数也可以做为一种类型使用示例代码:package mainimport ( "fmt")func main() {}// 参数列表和返回值,注意类型func test1(a int b string)原创 2017-08-13 11:05:53 · 488 阅读 · 0 评论 -
Go语言学习笔记 --- defer 、panic 、recover
defer与panic/recover执行方式类似其他语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行即使函数发生严重错误也会执行,类似finally支持匿名函数的调用常用于文件清理、文件关闭、解锁以及记录时间等操作通过与匿名函数配合可在return之后修改函数计算结果如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已获得了拷贝,否则则是引用某原创 2017-08-13 11:34:47 · 891 阅读 · 0 评论 -
Go语言学习笔记 --- struct
structGo 中的struct与C中的struct非常相似,并且Go没有class使用type struct{} 定义结构,名称遵循可见性规则支持指向自身的指针类型成员支持匿名结构,可用作成员或定义成员变量匿名结构也可以用于map的值可以使用字面值对结构进行初始化允许直接通过指针来读写结构成员相同类型的成员可进行直接拷贝赋值支持 == 与 != 比较运算符,但不支持 > 或原创 2017-08-13 17:00:51 · 569 阅读 · 0 评论 -
Go语言学习笔记 --- method
methodGo 中没有class, 但依旧有method通过显式说明receier来实现与某个类型的组合只能为同一个包中的类型定义方法Receiver可以是类型的值或指针不存在方法重载可以使用值或指针来调用方法,编译器会自动完成转换从某种意义上来说,方法是函数的语法糖,因为reveiver其实就是方法所接收的第一个参数(Method Value vs. Method Expressi原创 2017-08-15 20:50:34 · 486 阅读 · 0 评论 -
Go语言学习笔记 --- 入门介绍
根据 无闻 go语言基础教程 整理Go 是什么 Go 是一门并发支持、垃圾回收的编译型系统编程语言,旨在创造一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的一门编程语言。Go 主要特点类型安全和内存安全以非常直观和极低代价的方案实现高并发高效的垃圾回收机制快速编译(同时解决C语言中头文件太多的问题)为多核计算机提供性能提升的方案UTF-8编码支持Go 的价值原创 2017-07-26 22:50:40 · 771 阅读 · 0 评论 -
Fix cannot find package "golang.org/x/net/context"
在使用bleve这款全文检索引擎的时候,(备注:bleve的 读音 可以使用汉语“布拉维”)出现了一些错误,一些依赖包找不到,导致无法继续,下面做一些详细说明编译错误信息cannot find package "golang.org/x/net/context" in any of:.../projects/go-projects/src/github.com/blevesearch/bleve/原创 2017-08-26 23:08:44 · 7656 阅读 · 2 评论 -
Go语言学习笔记 --- interface
学习笔记根据 无闻 go语言基础教程 整理interface接口是一个或多个方法签名的集合Go 语言中所有类型都实现了空接口 (空接口是没有任何东西的接口)只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为Structural Typing接口只有方法声明,没有实现,没有数据字段接口可以匿名嵌入其他接口,或嵌入到结构中将对象赋值给接口时,会发生拷贝,原创 2017-08-18 00:23:58 · 494 阅读 · 0 评论