golang
文章平均质量分 84
golang
CoreDump丶
一枚学生党
展开
-
mangokit:golang web项目管理工具,使用proto定义http路由和错误
mangokit是一个web项目的管理工具,它的功能如下:1. 根据预设的项目结构创建出一个web项目,使用已有的代码框架,减少工作量2. 使用proto来定义http路由以及错误码,使用相关工具生成代码,完成自动结构体反序列化以及返回值响应3. 使用wire来管理依赖注入,减少依赖管理的烦恼原创 2023-12-20 18:58:45 · 1882 阅读 · 0 评论 -
Golang中gRPC使用及原理探究
gRPC是一种进程间通信技术,在微服务和云原生领域都有着广泛的应用。在使用之前需要使用proto文件来定义出message类型和service接口,比如下面的greeter";syntax表示proto语法版本,在此使用proto3版本第3行用于声明生成的go代码的package第9行和第13行定义了两个消息,都包含一个data的字段,类型为string第5行定义了一个名为Greeter的service,该service包含一个rpc方法为SayHello为请求类型,HelloReply。原创 2023-10-14 23:26:33 · 1553 阅读 · 0 评论 -
go字符串拼接方式及性能比拼
在golang中字符串的拼接方式有多种,本文将会介绍比较常用的几种方式,并且对各种方式进行压测,以此来得到在不同场景下更适合使用的方案。原创 2023-09-25 17:40:21 · 1360 阅读 · 0 评论 -
Golang源码探究——从Go程序的入口到GMP模型
在大多数的编程语言中,main函数都是用户程序的入口函数,go中也是如此。那么main.main是整个程序的入口吗, 肯定不是,因为go程序依赖于runtime,在程序的初始阶段需要初始化运行时,之后才会运行到用户的main函数,那么main.main是在哪里被调用的呢?接下来就从go程序的入口,再到go的GMP模型进行一个探究。原创 2023-06-29 13:13:43 · 655 阅读 · 2 评论 -
k8s调度器扩展(Scheduler Framework)、源码编译及部署
因为研究的需要,需要对K8S的调度器进行扩展,本文主要讲解了k8s调度器扩展的一个流程,其中包含源码修改、源码编译、调度器配置以及部署和本人所踩的一些坑,使用的k8s的版本为1.23.1原创 2023-04-13 20:10:27 · 1972 阅读 · 3 评论 -
k8s编程operator——(4) kubebuilder & controller-runtime源码分析
在本章中将会介绍k8s operator开发的脚手架kubebuilder和其生成的代码依赖的controller-runtime原创 2022-12-12 14:57:50 · 1495 阅读 · 0 评论 -
k8s编程operator实战之云编码平台——④web后端实现
在前两章中分别实现了k8s controller和后端pod的访问。通过controller可以实现code-server容器的创建、删除以及状态维护等,通过openresty可以实现后端pod的动态反向代理。接下来将会实现web后端,使用的`web框架为Gin`;`mysql驱动为sqlx`;`redis驱动为go-redis`;`以及grpc`。原创 2022-12-15 21:09:45 · 1172 阅读 · 0 评论 -
k8s编程operator实战之云编码平台——②controller初步实现
在上一章中介绍了整个云编码平台的架构设计,本章中将实现架构中的controller。需要使用的技术:k8s二次开发kubebuilder、grpc原创 2022-12-12 19:27:10 · 1874 阅读 · 0 评论 -
k8s编程operator实战之云编码平台——①架构设计
之前偶然接触到了腾讯的Cloud Studio平台,使用这个平台我们可以创建一个云上的IDE,我们在本地使用浏览器即可打开vscode来写代码。之后我就一直在想,这样一个平台是怎么样实现的?原创 2022-12-12 19:19:30 · 1711 阅读 · 0 评论 -
k8s编程operator——(1) client-go基础部分
client-go是一个golang的client,我们可以通过client-go与K8S apiServer进行交互,对k8s集群中资源对象,包括内置资源(例如:Pod、Deployment、Service等)和CRD进行增删改查等操作。client-go地址目录结构:该包包含了可以访问kubernetes集群的api,通过这些API可以与apiServer进行通信,对集群的资源对象进行增删改查。原创 2022-11-11 22:15:49 · 3943 阅读 · 0 评论 -
k8s编程operator——(3) 自定义资源CRD.md
在K8S系统扩展中,开发者可以通过CRD(CustomResourceDefinition)来扩展K8S API,其功能主要由APIExtensionServer负责。使用CRD扩展资源分为三步:注册自定义资源、 使用自定义资源、删除自定义资源原创 2022-11-26 20:38:07 · 2630 阅读 · 0 评论 -
k8s编程operator——(2) client-go中的informer
使用client-set可以很容易地对ApiServer中的数据进行增删改查。但是,如果每次都从ApiServer获取数据,特别是执行List操作时,ApiServer会查询并传输大量的数据,将会对其产生很大的压力。如果能将数据缓存到本地,并在数据变化时进行更新,获取数据时从本地获取,那么将会大大减轻ApiServer的压力。因此,本章将会对client-go中的informer进行一个探究,通过Infomer,我们可以实现将数据缓存到本地,并且当资源对象发生变化时,我们能获取到相应的变化,并进行处理。原创 2022-11-23 16:45:41 · 2088 阅读 · 3 评论 -
Golang标准库限流器rate使用
限流就是限制系统的输入和输出流量来达到保护系统的目的,限流在实际场景中应用十分广泛,尤其在高并发场景下,为了保证系统的可以用性,我们需要采取一些限流措施降级,一旦达到限制的阈值,就需要限制流量并采取一些措施来完成限制流量的目的(比如:延迟处理、拒绝处理等),以防止过多的请求而导致系统崩溃。在golang的标准库golang.org/x/time/rate有一个限流器的实现,这个限流器的实现方案是令牌桶。原创 2022-11-21 12:48:30 · 2216 阅读 · 0 评论 -
go build常用命令行选项
go build实质上是通过调用go自带的compile工具对go代码进行编译的。在linux下的位置为$GOROOT/pkg/tool/linux_amd64/compile。go build可以经过-gcflags向compile工具传递编译所需的命令标志选项集合。原创 2022-10-13 15:27:58 · 2175 阅读 · 0 评论 -
Golang源码探究 —— 网络轮询器netpoller
网络通信是服务端程序必不可少也是至关重要的一部分,基于TCP Socket的通信则是网络编程的主流。TCP Socket是最常见的网络编程,在POSIX标准发布后,Socket得到了各大主流操作系统平台很好的支持。 Go是自带运行时的跨平台编程语言,Go的net包中暴露给开发者的Socket也是建立在操作系统原生socket接口之上的。netpoller是Go语言用来屏蔽各个操作系统底层高效I/O多路复用的网络轮询器,它屏蔽了各个操作系统底层不同而且复杂的I/O多路复用的使用,在上层为我们提原创 2022-10-12 22:10:55 · 1546 阅读 · 0 评论 -
Golang源码探究 —— chan
在Golang中,chan是我们常用的数据结构,chan是并发安全的,在使用它的时候我们无需考虑锁的问题。而且chan使用非常方便,chan与goroutine配合,很容易就可以实现一个生产者/消费者模型。了解chan的源码可以让我们了解更多关于chan的实现以及更好的使用。原创 2022-09-08 14:32:41 · 2209 阅读 · 0 评论 -
Golang骚操作——使用runtime私有函数
在Golang中,变量、函数、结构体等访问权限是由标识符的首字母大小写决定的,首字母小写的变量等在其它包中是不可见的,那么我们如何才能使用它们呢?这就需要使用一些骚操作了。说起Golang的入口函数,我们都会认为是main.main,但是在Golang程序启动前,需要先执行runtime.main来初始化调度器、垃圾回收器等。这个main_main函数没有函数体,在链接的时候,编译器会将其链接到我们自己的main函数,然后由runtime.main来调用。原创 2022-08-23 14:39:21 · 599 阅读 · 0 评论 -
Golang源码探究 —— sync.Map
Golang内置的map是不支持并发读写的,它在内部有检测机制,一旦发现并发读写,就会panic。如果需要并发读写map,有三种方案。 。前两者的效率在大部分情况下都不如官方提供的sync.Map。接下来来分析一下sync.Map是如何实现并发读写的。 sync.Map的结构用图表示如下:源码如下: sync.Map结构体中包含了四个字段,其中包含了两个map[interface{}]*entry ,entry中包含了一个unsafe的Pointer,这个指针指向了真正的value值。原创 2022-06-28 17:04:12 · 1166 阅读 · 0 评论 -
Golang源码探究 —— map
哈希表的实现方式有多种,比如哈希表、红黑树等。Golang的map底层是用哈希表实现的,在介绍Golang map的实现之前首先介绍一下哈希表的两种实现方式: 开放寻址法,底层是一个数组,每个数组都存放一个键值对,空闲的地方就是没有放键值对的地方。首先看如何插入:key-val首先经过一个哈希函数将key值进行哈希得到一个大的数字,然后将其对数组的长度取模,这样它就落在了数组中的一个位置。如果得到的位置没有被占用,那么就直接存放在对应位置。如果已经被占用了,那么就向后寻找一个槽,直到找到空闲的原创 2022-06-25 14:10:03 · 2568 阅读 · 7 评论 -
Golang+Mysql+Vue+Nginx前后端分离项目--个人博客
之前利用空闲时间做了一个个人博客系统,后端主要使用golang+gin框架+Mysql实现,前端使用vue+element ui + bootstrap。项目的部署使用docker,nginx作为静态资源服务器和反向代理服务器。结构图如下:1、效果图访问地址:我的博客博客首页:博客详情页文章标签归档资源库博客后台管理 数据库设计数据库主要包含12张表,分别是用户表、博客类型表、博客标签表、资源库表、资源类别表、格言表、留言表、随笔表、博客评论表、博客标签中原创 2022-05-24 13:15:06 · 2249 阅读 · 10 评论 -
使用适配器简化golang gin框架开发
我们在使用Gin框架时,可能在handler中有很多分支判断语句,就要写很多的ctx.Json来返回数据,这样用起来很麻烦,看起来也不美观。本文将使用一个装饰器来简化Gin的数据响应。比如,我们在使用Gin框架时,往往会这么写,在创建用户的handler中反复使用ctx.Json来返回数据,handler多了也会显得很烦。因此能不能实现一个handle,直接返回值就可以达到写出数据的目的呢。这时就可以使用装饰器模式来进行优化一下了。type User struct { Username string原创 2022-04-29 09:40:20 · 335 阅读 · 0 评论 -
Golang函数选项模式
由于Golang不支持函数重载,因此无法像C++或Java那样可以定义多个同名不同参的构造函数,因此如果要定义多个构造函数就需要使用不同的名称。但是如果后续要给结构体增加新的字段,那么可能就需要修改很多的构造函数,函数选项模式就可以完美解决这个问题。1、正常的构造函数拿下面的代码举个例子:type User struct { username string password string nickname string age uint8 gender bool原创 2022-04-21 13:06:34 · 318 阅读 · 0 评论 -
Golang标准库binary
binary包实现了数字和字节序列之间的简单转换。1、ByteOrderByteOrder指定了如何将一个字节序列转换为16、32或64位的无符号整数:type ByteOrder interface { Uint16([]byte) uint16 Uint32([]byte) uint32 Uint64([]byte) uint64 PutUint16([]byte, uint16) PutUint32([]byte, uint32) PutUint64([]byte, uint64)原创 2021-11-20 18:07:40 · 2777 阅读 · 0 评论 -
Golang反射reflect
反射的基本介绍:反射可以在运行时动态获取变量的各种信息,比如变量的类型、类别。如果是结构体变量,还可以获取到结构体本身的信息(包含结构体的字段、tag、方法等)。通过反射可以修改变量的值,可以调用关联的方法。反射在很多框架中都有使用,使用反射可以写出一些比较通用性的方法,比如json数据的编解码。1、Golang反射中的一些定义1.1 KindKind代表Type类型值表示的具体分类。零值表示非法分类。Type是类型,Kind是类别。Type和Kind可能相同,也可能不相同:比如:原创 2021-11-15 23:38:30 · 739 阅读 · 1 评论 -
Golang源码探究 —— Slice
Golang中的切片算是在代码中使用频率最高的数据结构了,因此了解切片的底层实现可以让我们对切片的使用可以更加熟练和灵活。go的版本:go version go1.16.8 windows/amd641、切片的数据结构Golang中的切片定义在runtime包下的slice.go中,它在底层为一个结构体:type slice struct { array unsafe.Pointer // 指向数据缓冲区的指针 len int // 当前数据原创 2021-11-13 15:03:03 · 1222 阅读 · 0 评论 -
Golang中的一些小细节
1、golang中的结构体是可以直接比较的,底层调用了memequal函数来对内存进行比较,memequal是用汇编实现的。 2、golang中只有值传递。例如,用切片作为函数的形参时也是值传递,切片底层的数据结构为:// SliceHeader is the runtime representation of a slice.// It cannot be used safely or portably and its representation may// change in a原创 2021-11-09 15:26:00 · 393 阅读 · 0 评论 -
Golang打开文件资源管理器
有时候在使用git bash的终端时,想在终端中直接打开该位置的文件资源管理器,这个时候就可以用Go来一个这样的小程序,使用起来还是很方便的。package mainimport ( "fmt" "os" "os/exec" "strings")func main() { argLen := len(os.Args) dirName, err := os.Getwd() if err != nil { fmt.Println("Get Current Working Direc原创 2021-11-08 17:07:44 · 1112 阅读 · 0 评论 -
Golang字符串string详解
1、 string的定义Golang中的string的定义在reflect包下的value.go中,定义如下:StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度。// StringHeader is the runtime representation of a string.// It cannot be used safely or portably and its representation may// change in a late原创 2021-11-08 15:59:51 · 13076 阅读 · 0 评论 -
Goland标准库——os
os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。os包的接口规定为在所有操作系统中都是一致的。非公用的属性可以从操作系统特定的syscall包获取。1、常量定义文件相关:// 文件打开时指定的打开模式const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件.原创 2021-11-07 18:23:13 · 392 阅读 · 0 评论 -
Golang标准库——io
io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。io包中的源码都是BSD风格的。1、io包中定义的error// ErrShortWrite 当读取的字节不能满足需要的字节数时,就会返回该错误var ErrShortWrite = errors.New("short write")// errInvalidWrite 意味着返回一个不可能的字节数var errIn原创 2021-11-07 18:22:14 · 708 阅读 · 0 评论 -
用Golang实现一个统计代码行数的程序
在开发中,我们有时候想要统计一个文件夹下的所有代码的行数,但是有时候找这样的工具也挺麻烦的。那么就自己实现一个吧。思路:1、通过命令行参数获取要统计的代码所在根目录以及代码文件的后缀,比如Go语言是.go C++语言是.cpp2、从根目录开始递归遍历文件:1.如果是目录,就递归遍历;2.如果是普通文件,根据后缀判断是否是要统计的代码的文件,如果是就统计并打印代码行数。代码如下:package mainimport ( "bufio" "flag" "fmt" "io/ioutil".原创 2021-11-07 14:29:57 · 1980 阅读 · 0 评论 -
Vs code golang插件安装失败解决
使用Vscode 安装golang的插件时总是失败,没有代码提示让我们很烦,上网查方法,基本上是让你建立golang.org目录什么的,结果都不行,下面有一个很简单的解决方案:Go有一个全球模块代理,设置一下代理再去安装,就可以了。网站为: https://goproxy.io/1.在开始处右键,选择Windows PowerShell2.输入下面的命令重启vscode安装就可以了$env:GO111MODULE=“on”$env:GOPROXY=“https://goproxy.io” go原创 2020-12-15 17:51:12 · 525 阅读 · 0 评论