
Go之旅
文章平均质量分 73
因为热爱,所以喜欢。
码农渔夫
hax20211108 我是一名新时代广深漂AI农民工。喜欢分享,喜欢折腾,也热爱搞钱!
路漫漫其修远兮,吾将上下而求索。公号日更:「码农渔夫」
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
k8s-Informer之Reflector的解析
当资源对象发生变化时(如:添加和删除等事件),Reflector 会将其这些资源对象的变化包装成Delta并将其丢到DeltaFIFO中。通过 NewReflector 实例化 Reflector 对象,在实例中需要传入的 ListerWatcher 数据接口对象,这个包含核心 List 和 Watch 方法,主要是负责 List 和 Watch 指定的 Kubernetes APIServer 资源。组件的一个重要函数,它负责监听Kubernetes API server中的对象变更事件。原创 2024-12-07 15:05:43 · 640 阅读 · 0 评论 -
k8s-Informer之Indexer的解析(4)
Indexer 中的数据始终要是与 ETCD 中数据一致的,当 client-go 需要数据时,可直接通过该本地缓存获取资源对象,不需要每次都从 APIServer中获取,这样就减轻了请求过多造成对 APIServer 、etcd的压力。该方法传入索引器名称 indexName 和索引键名称indexedValue,方法寻找该索引器下,索引键对应的对象键列表,然后根据对象键列表,到Indexer缓存(即threadSafeMap中的items属性)中获取出相应的对象列表。3、Indexer 索引功能。原创 2024-12-07 15:05:09 · 563 阅读 · 0 评论 -
k8s-Informer之DeltaFIFO的解析(3)
在controller的Run方法中,调用NewReflector初始化Reflector时,同步了 DeltaFIFO,并且执行 processLoop 方法。DeltaFIFO 是一个增量的本地队列,记录资源对象的变化过程。它生产者是 Reflector 组件,将监听到的对象,同步到 DeltaFIFO 中,DeltaFIFO 又对资源对象做了什么呢。可知 Reflector里的 store.Add() 其实就是 DeltaFIFO 的 Replace、Add、Update、Delete方法的。原创 2024-12-07 15:03:50 · 614 阅读 · 0 评论 -
k8s-Informer概要解析(2)
Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。Informer 是一个带有本地缓存以及索引机制的核心工具包,当请求为查询操作的时候,会优先从本地缓存内存去查询数据,而 创建、更新、删除这类操作,则会根据事件通知写入队列 DeltaFIFO 中,同时对应的事件处理过后,更新本地缓存,使得本地缓存与 ETCD 的数据保持一致性。原创 2024-12-07 15:02:36 · 959 阅读 · 0 评论 -
k8s-client-go基本使用(1)
Client-go 是负责与 k8s APIServer 服务进行交互的客户端库,利用 Client-go 与 k8s APIServer 进行的交互访问,以此来对 k8s 中的各类资源对象进行管理操作,包括内置的资源对象及未来自定义的CRD资源。原创 2024-12-07 14:09:32 · 1232 阅读 · 0 评论 -
kubevirt 是什么?
卷是一种抽象概念,它们可以被格式化为文件系统,并被操作系统分配给应用程序或用户。卷通常由文件系统管理,它们可以被动态地扩展或收缩,以适应不同的存储需求。磁盘可以被划分成一个或多个分区,每个分区可以被格式化为一个文件系统,以便在上面存储数据。磁盘可以被划分为一个或多个分区,并且每个分区可以被格式化为一个文件系统并被挂载到一个挂载点上。因此,在某些情况下,磁盘可以被挂载为一个卷,然后使用该卷来存储数据。磁盘可以被分区并格式化为一个或多个卷,而卷可以动态地扩展或收缩以适应不同的存储需求。原创 2024-12-07 14:08:32 · 1123 阅读 · 0 评论 -
go 语言中协程和GMP模型
如果业务方法不调用 runtime.morestack(),可利用垃圾回收器的线程发送 SIGURG 信号,让这个业务方法强制跳到 信号处理函数 (doSigPreempt() ),重新回到 调度循环(Schedule),这样比较大的协程放在队列里面,优先调度饥饿的协程了。G 就是协程,M 是线程,P 是为了优化多线程并发时,会抢夺协程队列的全局锁问题,很多资料称为 ”处理器“,它是介于 M 与 G 中介的。协程,从 runtime 的角度看,协程就是一个被调度的 g 结构体。原创 2024-12-07 14:06:47 · 478 阅读 · 0 评论 -
go 语言中make和new有什么区别?
new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值。make 也是用于内存分配的,但是和 new 不同,它只用于 chan、map 以及 slice 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。原创 2024-12-07 14:06:04 · 128 阅读 · 0 评论 -
slice和map底层原理面试问题
因此,当你传递一个切片时,函数接收到的是指向相同底层数组的指针,因此它可以修改原始切片中的数据。进行扩容,当切片长度小于 256 将会翻倍扩容,大于 256 每次增加 25%,切片扩容时,并发不安全,需要并发加锁。nil 是空,并不一定是 ”空指针“,nil 是 6 种类型的零值。每种类型的 nil 是不同的,无法比较。如果对字符串直接使用下标访问,得到的是字节,所以需要 range 遍历时,被解码成 rune 类型的字符。如何直接赋值的话,是浅拷贝的,修改新的接收这个变量是会影响原来的数组。原创 2024-12-07 14:05:04 · 498 阅读 · 0 评论 -
年后跳槽,从 Go 到 Rust 面试挂了。
特征边界和 where 子句用于向函数和类型添加约束,确保它们遵守特定的要求或条件的,特征边界用于约束类型参数以实现特定特征。Rust 中的生命周期是一种标记,用于指定引用的有效范围,它的作用是确保引用不会超出其引用的对象的生命周期,防止悬垂引用和非法引用。我是渔夫,现在在国内某某云程序员,业余独立开发者,探索副业,生活、技术、非科班转码经验等相关文章,欢迎关注,和渔夫一起成长。闭包是从封闭范围捕获变量的匿名函数,根据闭包修改或编辑捕获的变量的能力,可以将闭包视为可变或不可变。原创 2024-03-02 10:47:45 · 1062 阅读 · 1 评论 -
Kubeadm初始化遇到的坑:[ERROR CRI]: container runtime is not running:
Kubeadm初始化报错:[ERROR CRI]: container runtime is not running原创 2022-10-12 16:13:07 · 11366 阅读 · 3 评论 -
Mutex 如何解决资源并发访问问题?
并发问题介绍在实际项目中,并发是非常常见的,尤其今天电商的兴起如购物时的秒杀系统、秒杀出现超卖、计数器、多个 Goroutine 并发更新同一个资源、用户账户出现透支、buffer 中数据混乱等等问题。这些问题如何去解决?对,用互斥锁,在 Go 语言中,就是 Mutex。互斥锁实现机制首先知道什么是临界资源,是指一个被共享的资源或者一个整体的一组共享资源。比如对数据库的访问、对某共享结构的操作、对一个I/O设备的使用、对一个连接池中的连接调用等等。对临界区限定同时只能有一个线程持有锁,其他线程如果原创 2022-02-19 16:21:15 · 426 阅读 · 0 评论 -
周末,阅读 Mutex源码,收获极大
Go 语言保证线程安全,可以使用 channel 和 共享内存去保证。Go 语言不仅仅提供基于 CSP 的通信模型,也支持基于共享内存的多线程数据访问,在Sync包提供了锁的基本原语。sync.Mutex 互斥锁,Lock加锁,unlock解锁。不论读和写都是互斥的。sync.RWMutex 读写分离锁,不限制并发读,只限制并发写和并发读写。sync.WaitGroup 它的语意就是定义一个组,这个组里面会有假如100个线程,每个线程在结束时候都应该去调Done(),只有结束Done()原创 2022-01-08 15:20:17 · 564 阅读 · 0 评论 -
Go语言怎么学,这份Go学习脑图送给你了
Go学习路线:在线脑图Golang 作为21世纪c语言,是一个年轻的语言,虽然生态体系没有Java那么庞大,如果你有其他编程基础,Go的基础语法以及一些基本操作1-2就搞定了,语法这快不要花太多时间,这块只要你多写程序自然而然熟悉,都不用太担心。对于初学者我觉得要快速过一遍,后面慢慢深挖细节和底层,找一些优质博客和书籍啊慢慢深入细节,先整体把握眼熟知道大概意思,你才知道哪里重要不重要,整体把控,再深入研究。如果选择Go语言,大家关心的是能不能找到工作,我觉得不必担心吧,go岗位据我了解一线城市岗位会多原创 2022-01-06 17:59:18 · 798 阅读 · 0 评论 -
Go如何保证并发读写的顺序
Go 的内存模型,由于在计算机要提高执行效率,需要CPU指令重排及多级缓存的存在,然后会带给来,确保多核访问一个变量时,显得比较复杂了。在加编译器的优化也会给指令进行重排,为了确保多线程同时访问共享变量时的可见性和顺序,需要一种规范来约定,这个规范被称为内存模型。Go 内存模型的主要目的:保证共享变量被多个goroutine 访问的情况,可以做一些串行化访问控制,比如 channel、sync及atomic包括的并发原语。允许编译器和硬件对程序做优化。先看,一个简单示例:var a,b int原创 2022-01-05 00:46:14 · 974 阅读 · 0 评论 -
彻底明白Go语言的Channel了
channel 概述Hello 大家好!我们又见面了,本文我们一起搞懂 Go语言中 channel 及channel底层实现和一些常见面试题。channel 是 Go 语言内建的first-class类型,也是 Go 语言与众不同的特性之一。先看一个应用场景,比如协程A执行过程中需要创建子协程A1、A2 … An,协程A创建完子协程后就等待子协程退出,这样场景的Go为我们提供三种解决方案:使用 channel 控制子协程waitGroup 信号量机制控制子协程Context 使用上下文控制子协程原创 2022-01-03 12:05:17 · 496 阅读 · 0 评论 -
Goroutine调度器及面试精选
Goroutine调度器Go语言在并发编程有着非常强大的能力,讲到调度器,我们的话题离不开操作系统、进程与线程这些概念,在学习操作系统时,线程是操作系统调度的最基本单元。在没有学习Go语言之前,线程之间通信,通过内存共享可以实现,但是在调度时每个线程都会占用1M以上内存空间,还有恢复寄存器中内容也需要向操作系统申请或销毁资源,这样会有较大额外开销。在Go语言中,不需要通过共享内存来通信,而是通过通信来共享内存,这也是Go语言最重要的编程理念。这样的话,Go调度器对Goroutine的上下文切换就减少额原创 2022-01-02 09:30:22 · 350 阅读 · 0 评论 -
Go语言Map底层原理入门级
Map底层原理map是一种数据结构,用于存储一系列无序的键值对,里面是基于键来存储的,这样我们可以通过键很快的找到对应的值。内部实现介绍Go底层是一个散列表,散列表里头包含一组捅,当在存储、删除及查找键值对的时候,所有的操作都是需要选择一个捅,把操作映射时指定的键传给映射的散列函数进行计算,就能找到对应的捅。通过合理数量的桶来平衡键值对的分布,这样大大提高查找效率。栗子:p := map[string]string{"Red":"#da23"}上面声明一个map,键值都是string类型,首先原创 2021-12-17 16:49:53 · 1396 阅读 · 0 评论 -
一起剖析Go语言切片
Go切片是什么?我们知道,Go语言数组的定长性和值拷贝限制了其使用场景,Go提供另一种数据类型slice,可以看着一种变长数组,其数据结构中有指向数组的指针,所以是一种引用类型。在开发中关于切片和数组怎么选择?先看看数组有什么问题?Go 数组是值类型,赋值和函数传参操作都会复制整个数组数据,下面代码是验证Go都是值复制:func main() { aa := [3]int{9,9,6} var bb [3]int bb = aa fmt.Printf("aa=%p,%d\nbb=%p,%d"原创 2021-12-15 15:00:35 · 1068 阅读 · 0 评论 -
Go语言反射,原来这么有趣
反射概述反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别。如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段,方法),使用反射,需要import(“reflect”)反射中变量、interface{}和reflect.Value是可以相互转换的,开发中常用。reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型reflect.Value是一个结构体类原创 2021-12-14 21:18:34 · 696 阅读 · 0 评论 -
Golang语言中最重要goroutine和channel,你真的入门了吗
1、goroutine协程也叫轻量级线程,为什么说是一个轻量级的线程呢?协程可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常不能超过1万个。在Go语言提供所有系统调用操作,都会出让CPU给其他goroutine,让轻量级线程的切换管理不依赖于系统的线程和进程,也不依赖CPU的核心数量。goroutine是Go语言轻量级线程实现,由Go运行时(runtime)管理的。栗子:假设我们需要实现一个函数sum(),它把两个参数相加,并且结果打印,代码如下:func sum(x, y int) {原创 2021-12-04 01:20:13 · 1247 阅读 · 0 评论 -
Go语言写了冒泡排序
package mainpackage mainimport "fmt"func sort1(arr []int) { for i := 0; i < len(arr) - 1; i++ { for j := 0; j < len(arr)- i -1; j++ { if arr[j] > arr[j+1] { arr[j],arr[j+1]=arr[j+1],arr[j] } } }}func main() { arr := []int{3原创 2021-12-02 14:19:58 · 129 阅读 · 0 评论