GO语言编程
来自万古的忧伤
努力,勿让自己继续活在后悔中
展开
-
go依赖注入wire
参考https://lailin.xyz/post/go-training-week4-wire.html 一 安装go get github.com/google/wire/cmd/wire或者go install 也可以然后在GOPATH/bin会有一个二进制文件放在GOPATH/bin 会有一个二进制文件 放在GOPATH/bin会有一个二进制文件放在PATH下面就可以了项目启动初始化过程中 会依赖很多库包,自己写会导致库的循环引用 用wire 可以避免循环引用以及依赖缺失二 简单使.原创 2022-04-26 09:43:57 · 541 阅读 · 0 评论 -
Operator字段校验
官方提供的字段校验https://book.kubebuilder.io/reference/markers/crd-validation.html根据官方的字段校验我们可以提供然后需要执行make generatemake installmake runkubectl describe crd redis.myapp.qushuaibo.com可以通过这个来实现对字段的一些输入校验apiVersion: myapp.qushuaibo.com/v1kind: Redism原创 2022-03-22 10:26:46 · 116 阅读 · 0 评论 -
Gin学习之路(三)
1.日志处理一般我们会自己写日志中间件,这里来看下gin提供的日志package mainimport ( "github.com/gin-gonic/gin" "io" "os")func main() { gin.DisableConsoleColor() f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f) router := gin.Default() router.GET("/p原创 2022-03-22 10:06:39 · 200 阅读 · 0 评论 -
Admission Controller简介
准入控制器介绍https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/动态准入控制器 https://kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-controllers/创建证书vi ca-config.json { "signing": { "default": { .原创 2022-03-18 11:20:20 · 1094 阅读 · 0 评论 -
模仿kubectl的top功能
package mainimport ( "context" "fmt" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/metrics/pkg/client/clientset/versioned")func main() { config ,err := clientcmd.BuildConfigFromFlags("","/Users/qushuaibo/.k原创 2022-03-17 14:33:07 · 712 阅读 · 0 评论 -
Go实现kubectl apply操作
package mainimport ( "bytes" "context" "fmt" "io" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" syaml "k8s.io/apimach原创 2022-03-16 14:34:07 · 1089 阅读 · 0 评论 -
go之gjson
引用 https://darjun.github.io/2020/03/22/godailylib/gjson/一 简介gjson实际上是get + json的缩写,用于读取 JSON 串二 使用1.安装go get github.com/tidwall/gjsonpackage mainimport ( "fmt" "github.com/tidwall/gjson")func main() { json := `{"name":{"first":"li","la原创 2022-03-15 15:11:55 · 2375 阅读 · 0 评论 -
go之bubbletea可视化操作
一 简介bubbletea是一个简单、小巧、可以非常方便地用来编写 TUI(terminal User Interface,控制台界面程序)程序的框架。内置简单的事件处理机制,可以对外部事件做出响应,如键盘按键。二 快速使用bubbletea程序都需要有一个实现bubbletea.Model接口的类型:type Model interface {// Init is the first function that will be called. It returns an optional//原创 2022-03-15 07:51:39 · 996 阅读 · 0 评论 -
kubectl插件之pod通过标签过滤
package mainimport ( "context" "fmt" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/kubernetes" "log" "os")var client = InitC原创 2022-03-13 07:46:17 · 1354 阅读 · 0 评论 -
kubectl通过插件获取pod列表
一 获取pod基础信息并且格式化展示package mainimport ( "context" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/kubernetes" "log" "os")var cl原创 2022-03-11 15:29:34 · 1018 阅读 · 0 评论 -
client-go之SharedInformerFactory 支持多条件索引过滤(and)
package mainimport ( "fmt" "github.com/gin-gonic/gin" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cl原创 2022-03-10 17:20:50 · 514 阅读 · 0 评论 -
client-go实现kubectl apply操作
dynamicClient实现kubectl apply 操作,采用动态的client来针对任何类型package mainimport ( "bytes" "fmt" "io" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" //"k8s.io/apimachinery/pkg/types" "k8s.io/client-go/dynamic" "k8s.io/apimach原创 2022-03-06 10:12:46 · 1780 阅读 · 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 · 734 阅读 · 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 · 1236 阅读 · 0 评论 -
用Go写一个远程终端
此次使用到了ssh协议clientpackage clientimport ( "fmt" "golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh/terminal" "io" "net" "os" "time")type Cli struct { IP string //IP地址 Username string //用户名 Password string //密码 Po原创 2020-09-21 18:16:57 · 897 阅读 · 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 · 829 阅读 · 0 评论 -
Go程序在容器中部署需要注意的小问题
引用书籍<<GO语言编程之旅>>问题描述在Go语言中,Go scheduler的P数量非常重要,因为它会极大地影响Go在运行时的表现。在目前的Go语言中,P的数量默认是系统的CPU核数。在容器化的环境中,Go程序所获取的CPU核数是错误的,它所获取的是宿主机的CPU核数。即使容器和宿主机的CPU核数是共享的,但在集群中我们会针对每个Pod分配指定的核数,因此实际上我们需要的是Pod的核数,而不是宿主机的CPU核数。造成的后果曾提到Go的M:N调度模型,其要求M必须与P进行绑原创 2020-09-16 15:54:58 · 299 阅读 · 0 评论 -
Gin学习之路—路由(二)
1.接收表单数据package mainimport ( "github.com/gin-gonic/gin")func main() { r:= gin.Default() r.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{ "status原创 2020-09-15 16:13:06 · 160 阅读 · 0 评论 -
Gin学习之路—路由(一)
一简介gin是一个轻量 且性能比较高的一个go的web框架二 安装go get -u github.com/gin-gonic/gin三启动package mainimport ( "github.com/gin-gonic/gin")func main() { r:= gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200,gin.H{"test":"test"}) }) r.Run(":9090")}原创 2020-09-14 16:08:20 · 1267 阅读 · 0 评论 -
Operator-demo
目录结构 api里面为我们基础结构体controller里面为我们的主体逻辑pkg里面为deploy和svc的一些创建函数github地址https://github.com/strive-after/operator-demo我们来看效果make install 我们部署crdmake run 我们启动controller基础环境#1.yamlapiVersion: ship.example.org/v1beta1kind: Frigatemetadata: name: f.原创 2020-08-31 22:08:07 · 610 阅读 · 0 评论 -
kubebuilder
官网https://book.kubebuilder.io/中文文档https://cloudnative.to/kubebuilder/参考https://www.operator.org.cn/operatorsdk-jian-jie学习链接operator实战一 简介二 安装linux && macos=$(go env GOOS)arch=$(go env GOARCH)# 下载 kubebuilder 并解压到 tmp 目录中curl -L https://g原创 2020-08-22 18:28:06 · 5370 阅读 · 0 评论 -
Operator-sdk
参考https://www.operator.org.cn/operatorsdk-jian-jie一、简介1.概述该项目是Operator Framework的一个组件,这是一个开源工具包,以有效,自动化和可扩展的方式管理Kubernetes原生应用程序,称为Operators。更多介绍内容,请阅读博客。Operators 可以在Kubernetes之上轻松地管理复杂有状态的应用程序。然而,由于诸如使用低级API,编写样板以及缺乏模块导致重复性工作等挑战,导致目前编写Operator可能很困难。原创 2020-08-22 11:25:01 · 2905 阅读 · 1 评论 -
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 · 4379 阅读 · 5 评论 -
Go之Operator(补充informers)
type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactorytype sharedInformerFactory struct { client kubernetes.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock .原创 2020-08-03 23:46:08 · 415 阅读 · 0 评论 -
Go之Cobra实现sql转换工具
在mysql中information_schema 提供了对数据库元数据的访问,可以获得mysql服务器自身相关的信息,如数据库、表名称、列数据类型、访问权限等(1)SCHMATA:提供有关数据库的信息,可与SHOW DATABASES语句等效COLUMNS:提供有关表中列的信息,可与SHOW COLUMNS语句等效TABLES:提供有关数据库中表的信息,可与SHOW FULL TABLES语句等效STATISTICS:提供有关表索引的信息,可与SHOW INDEX 语句等效USER_PRIV原创 2020-07-27 23:15:25 · 590 阅读 · 0 评论 -
Go之Operator(四)
学习链接operator实战更新中未完关于k8s常用lib库项目介绍client-goclient-go项目概览4种client的类型以及区别可以看这里clientclient-go子项目主要是golang语言链接k8s服务端的客户端库,以及k8s中各种内部存储的实现的封装.相对比较核心的是dynameic和tools的cache(1)dynameicpath :\kubernetes\staging\src\k8s.io\client-go\deprecated-dynamic原创 2020-07-26 14:59:40 · 995 阅读 · 0 评论 -
Go之Operator(补充tools)
学习链接operator实战持续更新中未完toolspath :kubernetes\staging\src\k8s.io\client-go\tools- authauth这里封装了一些认证的信息type Info struct { User string Password string CAFile string CertFile string KeyFile string BearerToken string Insecure原创 2020-07-26 14:58:32 · 366 阅读 · 0 评论 -
Go之Operator(三)
学习链接operator实战关于k8s常用lib库项目介绍apimachineryapimachinery项目概览apimachinery子项目主要是k8s服务端和客户段项目都共同依赖的一些公共方法,struct,工具的定义. 主要是服务于kubernetes,client-go,apiserver这三个项目.api目录(1)apitesting这里主要是帮我们做了一些默认字段的填充,就比如你创建的时候有些字段没设置,这里就会设置默认的(2)equality用来做转换的一些东西原创 2020-07-25 19:20:03 · 411 阅读 · 0 评论 -
Go之Operator(二)
学习链接operator实战关于k8s常用lib库项目介绍apiapimachinery1.api项目概览api子项目主要是k8s中各个主要项目中通用的一些api的struct的定义.git clone https://github.com/kubernetes/kubernetes.gitgit checkout -b remotes/origin/release-1.15.0 v1.15.0 #修改至当前版本(1)admission简单介绍type 主要是定义结构体的属性re原创 2020-07-25 17:53:02 · 637 阅读 · 0 评论 -
Go之Operator(一)
学习链接operator实战k8s开发人应该掌握的技能k8s基础api的规范和基本概念,以及一些常用的基础工具和库k8s子库api,apimachinery,client-go等基础库的熟悉k8s扩展api相关的开发框架聊聊k8s的API模型的定义对应API模型的操作资源模型的分类关于Labels,Selectors和Annotations的简单介绍关于controller的简单介绍1. 资源模型组成scheme(TypeMeta) 包含group version原创 2020-07-25 15:58:41 · 1346 阅读 · 0 评论 -
Go之Cobra实现时间工具
首先看一下目录结构// /cmd/time.gopackage cmdimport ( "github.com/spf13/cobra" "log" "strconv" "strings" "test/internal/timer" "time")var ( calculateTime string duration string timeCmd = &cobra.Command{ Use: "time", //显示在主命令里面的help Short原创 2020-07-24 07:20:55 · 369 阅读 · 0 评论 -
Go之time的时区
在验证一些时间的时候经常会发现少了8小时,那么可能会是时区的问题导致的go的time库中提供了location的两个时区local和utclocal表示当前系统的时区,utc表示通用协调时间也就是零时区,time默认了是utc时区我们可以通过time提供的loadlocation去切换时区如果传入name是空或者utc那么返回utc,如果传入的name是Local那么返回当前的本地时区Local,否则name应该是IANA时区数据库中记录的地点名,在不同的约定路径尽可能地查找所需的数据库func原创 2020-07-23 23:48:37 · 3421 阅读 · 0 评论 -
Go之Cobra仿写kubectl的命令行
package mainimport ( "fmt" "github.com/spf13/cobra" "log")var ( ns string //创建rootCmd主命令,并定义run执行函数(注意,此处是定义run函数而并非直接执行该函数,也可以通过rootcmd.ADDCommand方法添加子命令) //为命令添加命令行参数flag //执行rootCmd命令调用的函数,rootCmd.Execute会在内部回调run执行函数 rootCmd = &cobra.原创 2020-07-22 22:39:35 · 279 阅读 · 0 评论 -
Go之Cobra实现单词转换工具
Cobra特性支持子命令行(Subcommand)模式完全兼容posix命令行模式 支持全局、局部、串联的命令行参数flag支持全局、局部、串联的命令行参数flag轻松生成应用程序和命令如果命令输入错误提供智能建议自动生成命令和参数的帮助信息自动生成详细的命令行帮助自动识别-h help flag提供bash环境下的自动补全功能支持命令行别名自定义帮助和实用信息可与viper配置紧密结合自动生成应用程序的帮助手册一个简单的例子package mainimport (原创 2020-07-22 07:46:34 · 446 阅读 · 0 评论 -
Go之flag
本次flag介绍 部分引用书《Go语言编程之旅》 很不错的书 推荐指数⭐⭐⭐⭐⭐文末会附书封面package mainimport ( "flag")func main() { var name string flag.Parse() //调用newflagset会返回一个带有指定名称和错误处理的空命令集 goCmd := flag.NewFlagSet("go",flag.ExitOnError) goCmd.StringVar(&name,"name","Go语言","帮原创 2020-07-21 07:56:32 · 1083 阅读 · 0 评论 -
Go面试题(一)
1.请写出代码最后输出的内容package mainimport "fmt"func defer_call() { defer func() {fmt.Println("1")}() defer func() {fmt.Println("2")}() defer func() {fmt.Println("3")}() panic("异常")}func main() { defer_call()}执行结果defer的顺序我们都了解 类似于堆栈 后进先出 那么321没有什么原创 2020-07-18 23:23:55 · 1316 阅读 · 0 评论 -
go-client对接k8s
一、kubeconfig管理apiVersion: v1clusters:#定义api的地址以及证书- cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVZWFZK0prcFdjUERzVlZNZUZBbjVkM003WFRRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RUR原创 2020-07-14 23:39:03 · 4723 阅读 · 3 评论 -
Go使用bcrpyt哈希用户密码
bcrypt哈希字符串的组成bcrypt哈希由多个部分组成。这些部分用于确定创建哈希的设置,从而可以在不需要任何其他信息的情况下对其进行验证。上图是一个bcrypt哈希的示例图,其由四部分组成:Prefix说明了使用的bcrypt的版本Cost是进行哈希的次数-数字越大生成bcrypt的速度越慢,成本越大。同样也意味着如果密码库被盗,攻击者想通过暴力破解的方法猜测出用户密码的成本变得越昂贵。Salt是添加到要进行哈希的字符串中的随机字符(21.25个字符),所以使用bcrypt时不需要我们在表里原创 2020-07-05 20:21:57 · 1248 阅读 · 0 评论 -
Beego之conf
beego 默认会解析当前应用下的 conf/app.conf 文件。 通过这个文件你可以初始化很多 beego 的默认参数app.conf# 应用配置AppName=配置测试#运行, 生产模式prod[默认], 开发模式devRunMode=${RunMode||prod}#拷贝body数据CopyRequestBody=true#上传文件缓冲内存大小MaxMemory=104857600#修改服务器banner信息ServerName=cc#WEB配置AutoRend.原创 2020-07-05 11:08:04 · 797 阅读 · 0 评论 -
Beego之模板
bar.htmlbar: {{ .|lower }}index.html{{ .name }}{{ if .body }}男{{ else }}女{{ end }}{{ range .scores }}{{.}}|{{ end }}<br/>{{ range $index,$value := .scores }}{{$index}} = {{$value}} <br />{{ end }}{{ range .users }}{{ . }.原创 2020-07-05 10:58:44 · 2052 阅读 · 0 评论