go
文章平均质量分 61
go
fish_study_csdn
PHP go JAVA python 开发
展开
-
kubernetes Pod控制器Controller详解
controller: 在集群上管理和运行容器的对象Pod通过Controller实现应用的运维,比如伸缩,滚动升级等等pod和Controller的关系建立是通过label标签和selector选择器原创 2022-06-13 07:45:18 · 485 阅读 · 0 评论 -
Kubernetes 基本介绍及核心组件
最开始是谷歌公司内部使用的 Borg 系统,后面使用 Golang 重写并捐献给 CNCF 基金会开源了kubernetes 是一个开源的容器编排框架工具,有着极其丰富的生态资源原创 2022-06-08 15:27:57 · 278 阅读 · 0 评论 -
Docker 实战部署 Gin+MySQL+Redis
基于CentOS 7系统,docker 部署gin项目,主要有项目gin、MySQL、Redis。原创 2022-06-05 13:48:05 · 556 阅读 · 0 评论 -
golang 中的defer学习
1:defer的执行顺序多个defer出现的时候,它是一个“栈”的关系,也就是先进后出。一个函数中,写在前面的defer会比写在后面的defer调用的晚。package mainimport "fmt"func main() { defer func1() defer func2() defer func3()}func func1() { fmt.Println("A")}func func2() { fmt.Println("B")原创 2022-02-25 07:47:46 · 327 阅读 · 0 评论 -
go 的逃逸规则和实例
我们其实都知道一个普遍的规则,就是如果变量需要使用堆空间,那么他就应该进行逃逸。但是实际上Golang并不仅仅把逃逸的规则如此泛泛。Golang会有很多场景具备出现逃逸的现象。一般我们给一个引用类对象中的引用类成员进行赋值,可能出现逃逸现象。可以理解为访问一个引用对象实际上底层就是通过一个指针来间接的访问了,但如果再访问里面的引用成员就会有第二次间接访问,这样操作这部分对象的话,极大可能会出现逃逸的现象。Go语言中的引用类型有func(函数类型),interface(接口类型),slice(切片类型原创 2022-02-24 19:56:56 · 252 阅读 · 0 评论 -
Golang编译器得逃逸分析
go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析(escape analysis),当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。go语言声称这样可以释放程序员关于内存的使用限制,更多的让程序员关注于程序功能逻辑本身。我们再看如下代码:package mainfunc foo(arg_val int) (*int) { var foo_val1 int = 11; var foo_val2 int = 12; var f原创 2022-02-24 19:47:35 · 265 阅读 · 0 评论 -
如何分析go程序的运行时间与CPU利用率情况?
(1) shell内置time指令这个方法不算新颖,但是确很实用。time是Unix/Linux内置多命令,使用时一般不用传过多参数,直接跟上需要调试多程序即可。$ time go run test2.go &{{0 0} 张三 0}real 0m0.843suser 0m0.216ssys 0m0.389s上面是使用time对go run test2.go对执行程序坐了性能分析,得到3个指标。real:从程序开始到结束,实际度过的时间; user:程序在用户态度..原创 2022-02-24 08:03:26 · 930 阅读 · 0 评论 -
Golang协程调度(一):协程状态
在讲解操作系统进程调度的部分时,几乎所有的书籍都会先列出一张进程的状态迁移图,通过状态图,能很清晰的把进程调度的每个环节串联起来,方便理解。Go运行时的调度器其实可以看成OS调度器的某种简化版 本,一个goroutine在其生命周期之中,同样包含了各种状态的变换。弄清了这些状态及状态间切换的原理,对搞清整个Go调度器会非常有帮助。以下是我总结的一张goroutine的状态迁移图,圆形框表示状态,箭头及文字信息表示切换的方向和条件:状态详述下面来简单分析一下, 其中状态 Gidle 在Go原创 2022-02-23 22:00:37 · 2011 阅读 · 0 评论 -
为什么 Go 的负载因子是 6.5?
了解 map 底层我以前在写《深入理解 Go map:初始化和访问元素》时有介绍过 map 的基础数据结构。基本结构如下图:map 基本数据结构其中重要的一个基本单位是 hmap:type hmap struct {count intflags uint8B uint8noverflow uint16hash0 uint32buckets unsafe.Pointeroldbuckets unsafe.Pointe...原创 2022-01-21 22:48:01 · 886 阅读 · 1 评论 -
什么是协程,协程和线程的区别和联系?
1 进程进程是什么进程是操作系统对一个正在运行的程序的一种抽象,进程是资源分配的最小单位。进程在操作系统中的抽象表现为什么有进程为什么会有 ”进程“ 呢?说白了还是为了合理压榨 CPU 的性能和分配运行的时间片,不能 “闲着“。在计算机中,其计算核心是 CPU,负责所有计算相关的工作和资源。单个 CPU 一次只能运行一个任务。如果一个进程跑着,就把唯一一个 CPU 给完全占住,那是非常不合理的。那为什么要压榨 CPU 的性能?因为 CPU 实在是太快,太快,太快了,寄存器仅仅能够.原创 2022-01-18 17:23:43 · 1981 阅读 · 0 评论 -
new 和 make 是什么,区别是什么?
大家好,我是煎鱼。在 Go 语言中,有两个比较雷同的内置函数,分别是 new 和 make 方法,其主要用途都是用于分配相应类型的内存空间。看上去 new 和 make 都是分配内存的,那他们有什么区别呢?这个细节点也成为了不少 Go 语言工程师的面试题之一,值得大家一看。在这篇文章中我们将来解答这个问题。基本特性make在 Go 语言中,内置函数 make 仅支持 slice、map、channel 三种数据类型的内存创建,其返回值是所创建类型的本身,而不是新的指针引用。函数签名如原创 2022-01-18 15:35:38 · 1030 阅读 · 0 评论 -
Go 面试官问我如何实现面向对象?
1 什么是面向对象在了解 Go 语言是不是面向对象(简称:OOP) 之前,我们必须先知道 OOP 是啥,得先给他 “下定义”。根据 Wikipedia 的定义,我们梳理出 OOP 的几个基本认知:面向对象编程(OOP)是一种基于 "对象" 概念的编程范式,它可以包含数据和代码:数据以字段的形式存在(通常称为属性或属性),代码以程序的形式存在(通常称为方法)。对象自己的程序可以访问并经常修改自己的数据字段。对象经常被定义为类的一个实例。对象利用属性和方法的私有/受保护/公共可见性,对原创 2022-01-14 23:06:06 · 222 阅读 · 0 评论 -
Go语言参数传递是传值还是传引用
1 什么是传值(值传递)传值是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的是这个该指针的一份拷贝,而不是这个指针指向的值。对于int这类基础类型我们可以很好的理解,它们就是一个拷贝,但是指针呢?我们觉得可以通过它修改原来的值,怎么会是一个拷贝呢?下面我们看个例子。func main() { i:=10 ip:=&i fmt.Printf("原始指针的内存地址是:%p\n"原创 2022-01-14 15:26:04 · 242 阅读 · 1 评论 -
channel的使用总结
1 channel的使用场景把channel用在数据流动的地方:消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步2 channel的基本操作和注意事项channel存在3种状态:nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭channel后,channel的值是nilchannel可进行3种操作:读 ...原创 2021-12-29 16:08:45 · 146448 阅读 · 0 评论 -
解决cannot resolve directory问题
在写代码的时候,已经执行了go mod initgod mod tidy自己能看到的确把对应的包下载下来了,可是goland 仍然飘红解决方法原因是Goland 编辑器中项目设置为 go modules 项目,导致从gomod读取,从而飘红,具体修改设置如下:Goland -> Preference把 enable go modules(vgo) integration 选中,如图所示,问题解决...原创 2021-10-24 17:49:54 · 3098 阅读 · 0 评论 -
Mac上k8s安装之minikube 安装与使用
通常,k8s需要两台机器组成一个k8s集群(master与slave),但是minikube是k8s的缩减版,一个minikube就相当于一个k8s集群。下图是是minikube的作用示意图:A: 通过minikube服务生成kubectl的配置文件(kubectl,也就是kube control ,它是k8s集群的客户端)B、C:通过minikube启动Minikube 虚拟机,虚拟机内容是minikube服务集群(精简版的k8s集群)D: 通过kubectl使用~/.kube/...原创 2021-10-11 23:04:41 · 1734 阅读 · 0 评论 -
docker 根据镜像名称查找容器并删除
docker ps -f(--filter) 命令详解过滤器:过滤标志(-f或-filter)格式为key=value,如果超过一个过滤,就传递多个标志(如-filter "foo=bar" -filter "bif=baz")目前支持的过滤有如下这些id (容器的id)labelname(容器名称)exited (整数-容器退出状态码,只有在使用-all才有用)status 容器状态(created,restarting,running,paused,exited,dead)ances原创 2021-10-09 11:50:01 · 4856 阅读 · 0 评论 -
链路追踪之Jaeger安装与使用
官方给出的特性介绍:分布式上下文传递分布式事务监控根本原因分析服务依赖分析性能、延迟优化可扩展性Jaeger的后端为无单点故障设计,可随时根据需要进行扩展;uber每天使用它处理几十亿级别的span。span,表示一个逻辑工作单元,包含有操作名称、起始时间以及操作耗时。span之间可以存在嵌套和并排关系,span之间也有顺序。1原生支持OpenTracing通过span引用以有向无环图表示trace支持强类型的span tag和结构化日志通过baggage支持分布式的上下文原创 2021-10-04 21:17:27 · 1794 阅读 · 0 评论 -
Golang 内存分配之逃逸分析
golang 的内存分配之堆和栈Go的垃圾回收,让堆和栈堆程序员保持透明。真正解放了程序员的双手,让他们可以专注于业务,“高效”地完成代码编写。把那些内存管理的复杂机制交给编译器。栈 可以简单得理解成一次函数调用内部申请到的内存,它们会随着函数的返回把内存还给系统。下面来看看一个例子:func F() { temp := make([]int, 0, 20) ...}上面的例子,内函数内部申请的临时变量,即使你是用make申请到的内存,如果发现在退出函数后没有用了,那么就把丢到原创 2021-09-26 21:43:43 · 217 阅读 · 0 评论 -
go 内存逃逸
问题知道golang的内存逃逸吗?什么情况下会发生内存逃逸?怎么答golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它逃逸了,必须在堆上分配。能引起变量逃逸到堆上的典型情况:在方法内把局部变量指针返回局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。 发送指针或带有指针的值到 channel 中。在编译时,是没有办法知道哪个 goroutine...原创 2021-09-26 16:37:23 · 161 阅读 · 0 评论 -
Go Protobuf 教程
1 Protocol Buffers 简介protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的,占用空间小,但也带来了可读性差的缺点。protobuf 在通信协议和数据存储等领域应用广泛。例如著名的分布式缓存工具Memcached的 Go 语言版本groupcache就使用了 protobuf 作为其 RP...原创 2021-09-15 15:40:00 · 1022 阅读 · 0 评论 -
go channel类型的用法总结
这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。channel的使用场景把channel用在数据流动的地方:消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ...channel的基本操作和注意事项channel存在3种状态:nil,未初始化的状态,只进行了声明原创 2021-09-12 15:00:32 · 620 阅读 · 0 评论 -
超全golang面试题合集和答案+golang学习指南+golang知识图谱
https://blog.51cto.com/u_15102959/2637222原创 2021-08-25 14:52:51 · 6934 阅读 · 0 评论 -
golang中的unsafe包详解
从golang的定义来看,unsafe 是类型安全的操作。顾名思义,它应该非常谨慎地使用; unsafe可能很危险,但也可能非常有用。例如,当使用系统调用和Go结构必须具有与C结构相同的内存布局时,您可能别无选择,只能使用unsafe。关于指针操作,在unsafe包官方定义里有四个描述:任何类型的指针都可以被转化为Pointer Pointer可以被转化为任何类型的指针 uintptr可以被转化为Pointer Pointer可以被转化为uintptr额外在加上一个规则:指向不同类型数据的指针,原创 2021-08-24 09:28:09 · 2734 阅读 · 0 评论 -
go nil切片和空切片 一样吗
nil切片和空切片指向的地址一样吗?这个代码会输出什么?怎么答nil切片和空切片指向的地址不一样。nil空切片引用数组指针地址为0(无指向任何实际地址) 空切片的引用数组指针地址是有的,且固定为一个值s1 pointer:{Data:0 Len:0 Cap:0}, s2 pointer:{Data:824634207952 Len:0 Cap:0}, s4 pointer:{Data:824634207952 Len:0 Cap:0}, false //nil切片和空切片指向的数组地址不一样原创 2021-08-17 14:50:40 · 227 阅读 · 1 评论 -
使用 GODEBUG 看调度跟踪,学习go调度器GMP
让 Go 更强大的原因之一莫过于它的 GODEBUG 工具,GODEBUG 的设置可以让 Go 程序在运行时输出调试信息,可以根据你的要求很直观的看到你想要的调度器或垃圾回收等详细信息,并且还不需要加装其它的插件,非常方便,今天我们将先讲解 GODEBUG 的调度器相关内容,希望对你有所帮助。不过在开始前,没接触过的小伙伴得先补补如下前置知识,便于更好的了解调试器输出的信息内容。前置知识Go scheduler 的主要功能是针对在处理器上运行的 OS 线程分发可运行的 Goroutine,而我们原创 2021-08-06 15:32:20 · 640 阅读 · 0 评论 -
Golang跟踪剖析trace的使用
Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 go tool trace 来打开新世界的大门。初步了解import ( "os" "runtime/trace")func main() { trace.Start(os.Stderr) defer tr.原创 2021-08-06 12:07:48 · 1071 阅读 · 0 评论 -
Go语言不可比较类型与Map问题
Go语言不可比较类型与Map问题1. 昨日题目的解答题目1:slice输出结果分析?s1_ : [2 3 4 5] 4 7s2_ : [5 6] 2 4s3_ : [] 0 2s4_ : [7] 1 2输出这个结果问题是因为:先看s1,这个答案比较简答是2 3 4 5,此时切片s1_是arr的一个view,s1_有len与cap,此时len=4,cap=7。s2_是从s1_的index=3取,对应数字5,此时还可以向后扩展,超过了len,但没超过cap,此时结果就是5 6,...原创 2021-08-06 11:44:35 · 742 阅读 · 0 评论 -
go atomic
atomic 使用场景简单package mainimport ( "fmt" "sync/atomic" "time")func main() { var total int32 =0 for i:=0; i<10; i++{ go func() { for { atomic.AddInt32(&total,1) fmt.Println("total=%d",total) time.Sleep(time.Millis原创 2021-08-01 09:07:06 · 64 阅读 · 0 评论 -
go sync.Mutex
package mainimport ( "fmt" "sync" "time")func main() { var total =0 var mux sync.Mutex for i:=0; i<10; i++{ go func() { for { mux.Lock() total += 1 fmt.Println("total=%d",total) time.Sleep(time.Millisecond) mux.U.原创 2021-08-01 09:06:32 · 57 阅读 · 0 评论 -
waitgroup 使用
1: waitgroup的操作都是原子性操作,核心是cas的使用2:Add放在goroutine 外,Done 放在goroutine内package mainimport ( "fmt" "sync" "time")func main() { var wg sync.WaitGroup wg.Add(2) go job1(&wg) go job2(&wg) wg.Wait() fmt.Println("all done")}func job1 (原创 2021-08-01 09:06:14 · 210 阅读 · 0 评论 -
pprof 性能分析(cpu 性能分析,内存分析)
完整例子代码package mainimport ( "encoding/binary" "fmt" "log" "net" "net/http" _ "net/http/pprof" "strconv" "strings" "time")func main() { go func() { log.Println(http.ListenAndServe(":8888", nil)) }()原创 2021-07-27 22:40:57 · 2184 阅读 · 0 评论 -
go consul 安装,代码实现微服务注册和发现
1. 什么是服务注册和发现假如这个产品已经在线上运行,有一天运营想搞一场促销活动,那么我们相对应的【用户服务】可能就要新开启三个微服务实例来支撑这场促销活动。而与此同时,作为苦逼程序员的你就只有手动去 API gateway 中添加新增的这三个微服务实例的 ip 与port ,一个真正在线的微服务系统可能有成百上千微服务,难道也要一个一个去手动添加吗?有没有让系统自动去实现这些操作的方法呢?答案当然是有的。当我们新添加一个微服务实例的时候,微服务就会将自己的 ip 与 port 发送到注册中心,在注原创 2021-07-27 13:56:19 · 476 阅读 · 0 评论 -
docker 安装consul以及部署consul集群
1.拉取镜像docker pull consul:latest2.启动第一个consul节点docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0 .0.0.03.查看consul1的ip地址,把后面要添加的consul.原创 2021-07-27 02:11:09 · 452 阅读 · 0 评论 -
UML六种关系
UML定义的关系主要有:泛化、实现、依赖、关联、聚合、组合,这六种关系紧密程度依次加强,分别看一下泛化是一种一般与特殊、一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并对其进行了扩展。在程序中是通过继承类实现的。比如狗是对动物的具体描述,在面向对象设计的时候一般把狗设计为动物的子类。表示方法:空心三角形箭头的实线,子类指向父类实现原创 2016-05-01 15:46:22 · 326 阅读 · 0 评论 -
Go语言使用channel等待任务结束
一、使用channel来等待goroutine结束方法一:type worker struct { in chan int done chan bool}func doneWorker(id int, w worker) { for n := range w.in { fmt.Printf("worker %d received %c\n", id, n) w.done <- true }}func createWorker(id原创 2021-07-24 16:57:59 · 492 阅读 · 0 评论 -
Go的垃圾回收机制
一.历史原因 go发展史上采用过的一些方法 垃圾回收设计的名词 v1.3 之前的标记 - 清除方法 标记清除的缺点 二.三色标记法 三色标记法的流程 如果三色标记法不使用 STW 会出现的问题 强弱三色不变式 三.屏障一.历史原因go发展史上采用过的一些方法go 1.3之前使用标记清除 go 1.5三色标记法 go 1.8三色标记法 + 混合写屏障机制垃圾回收设计的名词自动释放 垃圾回收 三色标记法 内存管理 SWT...原创 2021-07-22 16:26:08 · 1420 阅读 · 2 评论 -
深入理解Golang之context
为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done channel来处理此类问题。比如以下这个例子:package mainimport ( "fmt" "time")func main() { messages := make(chan int, 10) done := make(chan bool) defer close(messages) // consume原创 2021-07-22 15:58:01 · 128 阅读 · 0 评论 -
Golang并发模型GMP 深入了解
从进程谈起进程与线程的区别是什么?这是一个老生长谈的一道面试题。处于不同层面对该问题的理解也大不相同。对于用户层面来说,进程就是一块运行起来的程序,线程就是程序里的一些并发的功能。对于操作系统层面来说,标准回答是“进程是资源分配的最小单位,线程是cpu调度的最小单位”。接下来先从操作系统层面介绍一下进程与线程。进程在程序启动时,操作系统会给该程序分配一块内存空间,对于程序但看到的是一整块连续的内存空间,称为虚拟内存空间,落实到操作系统内核则是一块一块的内存碎片的东西。为的是节省内核空间,方便原创 2021-07-22 11:30:50 · 638 阅读 · 1 评论 -
go-protoc导出时遇到protoc-gen-go: unable to determine Go import path解决方法
什么是protobufprotobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。原创 2021-07-15 10:59:17 · 3242 阅读 · 0 评论