Go
这不是一门语言, 而是一套新的方法论
go是世界上最好的语言!
静谧之心
专业摩的佬
业余吉他手
退役喷子
拍照小法师
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分层架构下的跨层通信:接口抽象如何解决反向调用
本文探讨了分层架构中实现反向通知的接口解耦方法。通过"K8S错峰控制器"的三层架构示例,展示了ResourceManager→StrategyManager→Dispatcher的单向依赖链。为解决策略更新需反向通知Dispatcher的需求冲突,提出了"接口订阅"模式:在策略层定义ReloadNotifier接口,由调度层实现该接口并在初始化阶段注册,使下层通过接口适配上层的通知契约。这种设计既保持了分层架构的单向依赖原则,又实现了模块间的松耦合通信,有效提升了系统原创 2025-08-10 14:35:02 · 373 阅读 · 0 评论 -
每期一个小窍门:用 “抢鸡蛋” 读懂 Go 并发核心 —— 为什么 “通信” 比 “共享内存” 更靠谱?
本文通过“抢鸡蛋”的例子生动演示了Go语言并发编程的核心思想——"通过通信共享内存"。生产者通过无缓冲通道发送11个鸡蛋,100个消费者从通道获取鸡蛋,利用chan传递数据和sync.WaitGroup控制流程。这种方式避免了传统共享内存需要加锁的问题,通道本身具有并发安全性,通过关闭通道传递结束信号,WaitGroup自动管理任务状态。与共享内存相比,通信方案更简洁高效,无需处理锁的复杂性,体现了Go语言"不要通过共享内存来通信,而要通过通信来共享内存"的并发哲学。原创 2025-07-27 14:38:09 · 370 阅读 · 0 评论 -
# Go语言并发陷阱:为什么channel同步了,数据却偶尔打印不出来?
摘要:Go语言并发编程中偶发"打印结果丢失"问题,根源在于主协程提前退出导致内核缓冲区未及时刷新。文章分析了数据从代码到终端的三个缓冲区层级(Go用户态→OS内核→终端设备),指出通道同步虽保证数据传递但不确保打印完成。特别在首次运行时,编译缓存导致的启动时间差异会放大该问题。解决方案需三重保障:通道同步确保数据传递、os.Stdout.Sync()强制刷新内核缓冲区、sync.WaitGroup确保主协程等待子协程完成完整打印流程。(149字)原创 2025-07-27 13:15:38 · 792 阅读 · 0 评论 -
深入理解k8s中的容器存储接口(CSI)
Pod调度到节点后,AD控制器创建VolumeAttachment对象,External Attacher调用CSI插件挂接存储卷,完成后更新状态。:用户创建PVC,K8s根据PVC和StorageClass,让External Provisioner调用CSI插件创盘,之后创建PV并绑定PVC。:Kubelet发现使用CSI类型PV的Pod调度到本节点,等待VolumeAttachment状态就绪,调用CSI插件挂载。,而且存储插件特权高,存在安全隐患。CSI的出现,就是为了解决这些问题,把。原创 2025-02-05 15:40:34 · 1735 阅读 · 0 评论 -
每期一个小窍门:活用 Golang 中的 Context
等信息,且获取订单、推荐、物流信息分别有 500 毫秒、400 毫秒、700 毫秒的超时限制。在 Golang 并发和分布式系统中不可或缺,掌握它有助于开发高效应用。各分支任务要有超时控制,且单个分支超时时不能影响整体流程;再看自定义场景,有一个查询接口需在 1 秒内完成,要传递。在此过程中,存在诸多问题:需在。并传值,子函数中也根据需求设置超时和获取值。分别处理订单详情、推荐商品和物流信息,且这些。这里设置 1 毫秒超时,超时会输出。子goroutine。子goroutine。子goroutine。原创 2025-01-10 11:28:18 · 430 阅读 · 0 评论 -
每期一个小窍门: docker 多阶段镜像打包
使用多阶段镜像 本质上是打包与运行期的依赖分离 可以减小最终镜像大小。打包使用800M的 golang:1.23。运行期使用几M的alpine。原创 2024-08-27 09:39:21 · 360 阅读 · 1 评论 -
每期一个小窍门 golang中 CGO_ENABLED 含义
总结起来,使用CGO_ENABLED=0编译会慢一些是因为编译器需要额外的时间来处理CGO相关的代码,并且无法使用C语言的优化技术,同时还需要处理更多的Go代码。CGO_ENABLED是一个环境变量,用于控制Go编译器是否启用CGO(C语言调用Go函数)功能。当CGO_ENABLED=0时,表示禁用CGO功能。原创 2024-08-26 17:39:10 · 1806 阅读 · 0 评论 -
每期一个小窍门: 关于 golang 2006年1月2日15时4分5秒 这个时间彩蛋
在Go语言中,time.Format方法的参数使用的是一种固定的格式化布局,这个布局是以Go的发布日——2006年1月2日15时4分5秒(对应于常量Mon Jan 2 15:04:05 MST 2006)为模板来指示时间的格式。在使用 time.Format 方法时,必须使用上面这个准确的时间来指定你想要的格式,因为Go语言将使用这个布局字符串中的数字位置来识别相应的时间部分。比如,如果你想要小时和分钟,你就使用 “15:04” 作为格式字符串。原创 2024-08-22 11:15:58 · 482 阅读 · 0 评论 -
每期一个小窍门: Goland 配置跳板机登陆并使用dlv 远程调试
本地 访问 localhost:6000 --> 转发到跳板机:22 --> 再转发到指定内网地址。好了 第一件事完毕 本地已经可以直接登陆到远程被跳机了。本机公钥 copy 到跳板机 和内网被跳机。本机 .ssh/config。原创 2024-08-15 20:52:45 · 481 阅读 · 0 评论 -
每期一个小窍门:全世界最简单的go exporter 例子
调用链路我大概描述下。原创 2024-08-07 16:35:09 · 422 阅读 · 0 评论 -
每期一个小窍门: 使用kubebuilder 生成operator脚手架 并操作控制自定义CRD副本数 (下)
然后这边 kubectl get pod 可以看到如我们所愿 有5个启动的pod 对应了上方的部署文件。通过拿到的运行期状态 来跟部署文件的期望状态对比 然后进行不同业务响应就ok了。写好这个文件后 直接通过自带的make命令 install 到k8s中。有了这个dacar类型之后 我们徒手制作一个这个类型的部署文件。由于这个是demo 我们就不把operator部署到集群侧了。在这个文件中定义 dacar 这个crd的spec。我们发现可以查看到这个crd了。apply 这个文件后。原创 2024-08-03 15:30:52 · 701 阅读 · 0 评论 -
使用kubebuilder 遇到的 262144 bytes 超长问题
make install报错metadata.annotations: Too long: must have at most 262144 bytes。修复方法:打开Makefile,在。最后成功install。原创 2024-08-01 20:25:10 · 801 阅读 · 0 评论 -
每期一个小窍门: 使用Gin 与 client-go 操作k8s (中)
本文承接上文后面应该还会有个下 应该是个operator的全程demo。原创 2024-07-30 20:19:16 · 731 阅读 · 0 评论 -
每期一个小窍门: 使用client-go 操作k8s (上)
然后把apiserver公网暴露出来 并拿到apiserver的远程conf文件。身边要有一个k8s集群 阿里云ask可以免费使用 注意是ask 不是ack。好了 各位再见 下次再会。运行结果: 可以通的。原创 2024-07-27 16:20:24 · 493 阅读 · 0 评论 -
每期一个小窍门: go不同项目之间的引用
那么你有一个包moda, 放在/home/aio/moda下面, 然后你想用go mod, 那么会执行go mod init A包名。然后你的modb也需要用go mod, 所以你执行go mod init modb。然后你就得到了go.mod文件。不出意外的话, 应该就引用到了。原创 2024-01-28 13:02:54 · 461 阅读 · 0 评论 -
golang视角下 protobuf 的安装 从proto文件到go文件
Protocol Buffers(protobuf)是一种由Google开发的轻量级、高效的数据序列化格式。它设计的目的是为了在不同系统之间进行数据交换,同时保持数据的结构化和高效传输。原创 2024-01-25 18:27:01 · 991 阅读 · 0 评论 -
go: 高性能json工具 easyjson 简介
【代码】go: 高性能json工具 easyjson 简介。原创 2023-08-27 13:40:48 · 1050 阅读 · 0 评论 -
解决 go mod tidy 加载模块超时
如果go mod tidy 加载模块超时。原创 2023-08-23 13:48:36 · 2345 阅读 · 0 评论 -
每期一个小窍门: go 实现单例
go语言实现单例很简单 不需要类似java的double check 双重锁这种。通过 sync.Once 的once.Do() 只运行一次来实现。原创 2023-08-19 10:30:00 · 215 阅读 · 0 评论 -
每期一个小窍门: go 中 不确定的select语句
由于 goroutine 的执行顺序不确定,所以这里也不确定到底是该输出 42 43 还是 The default case!,可以用下面的脚本执行 5000 次看看(大家把下面的脚本保存成 for.sh,然后 chmod a+x for.sh,接着 ./for.sh)然后到 for.txt中看输出,大部分都是 default,很小部分是 42 和 43。所以他还是会优先的选择 case 去执行,只是我们不要写这种 select,一旦写了,我们大抵要为这种不确定性付出代价。原创 2023-08-15 23:24:40 · 257 阅读 · 0 评论 -
每期一个小窍门: 通过 两个小例子 玩转go channel
通道类似一个没有持久化功能的, 完全基于内存的, 消息队列原创 2023-08-15 00:15:32 · 331 阅读 · 0 评论 -
编程小窍门: 一个简单的go mutex的小例子
【代码】编程小窍门: 一个简单的go mutex的小例子。原创 2023-08-14 22:37:18 · 544 阅读 · 0 评论 -
深入理解 go协程 调度机制
Go 启动的时候,会有一个守护线程 G0,计数,会记录每个 Processor 运行完成的协程的数量,如果发现某一个 Processor 在一段时间内没有发生变化(阻塞),就会往这个协程的任务栈里面插入一个特殊的标记,当协程运行遇到非内联函数,就会读到这个标记,将自己中断下来,插到等待协程队列的队尾,切换到其他队列的队尾。内核线程是由CPU直接调度,如果一个用户线程对应一个内核线程,调度效率来看肯定是快于多个用户线程对应一个内核线程的。当协程被中断的时候,它在寄存器中的运行状态,也会保存在协程对象中;原创 2023-08-14 14:08:58 · 785 阅读 · 0 评论 -
每期一个小窍门: 玩转go mod 命令
这个工具类的 package name = util666。这个工具类的 物理路径是 = test666/util。可以使用下面两个命令来确保依赖正常加载。挎包调用需要大写 方法/变量 首字母。test666 是自身的mod名称。当然 你也可以使用别名来调用。main中引用了 一个工具类。原创 2023-08-13 21:58:35 · 682 阅读 · 2 评论 -
每期一个小窍门: go处理异常的一些小窍门
判断异常时, 异常逻辑在前, 即使有复杂业务逻辑判断, 也同样是扁平结构。go设计者更偏向于C的error处理方式, 快速失败是更简单高效的。我们可以利用error接口和多返回值来实现异常传递。error可以利用变量来复用 等价判断。没有类似java的exception。原创 2023-08-13 13:05:04 · 288 阅读 · 1 评论 -
每期一个小窍门: go 的小接口多组合思想
go中的接口更加灵活。原创 2023-08-12 21:51:42 · 253 阅读 · 1 评论 -
每期一个小窍门: go语言的两种接受者
在 Go 语言里,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数。我们可以看到,方法是在 func 和 notify 之间多了一个 user 类型的参数 u ,这个 u 就称作接收者。原创 2023-08-12 16:51:11 · 349 阅读 · 0 评论 -
每期一个小窍门: go中通过函数式编程, 将目标方法计时
【代码】每期一个小窍门: go中通过函数式编程, 将目标方法计时。原创 2023-08-09 23:30:45 · 228 阅读 · 0 评论 -
每期一个小窍门: 关于 go 的 iota 计数器
准确的说:iota出现在const语句块中的第几行,那么它就是几,当然这里的行数的索引也是以0为开始。因为iota一般出现在const语句块的第一行,不少的初学者会将之认为iota就是0,这是不对的。const中每新增一行常量声明将使iota计数一次,当然前提是iota在const中出现。iota是常量的计数器,可以理解为const定义常量的行数的索引,注意是行数。原创 2023-08-08 17:48:46 · 305 阅读 · 0 评论 -
GoLang 快速入门 合理实用常量
go的常量很方便iota 是一个只能在常量表达式中使用的一个标识符, 是一个常量计数器, 初始值为0, 新增一行, 下面的常量会+1下面是关于常量的小例子package constant_testimport "testing"/*constant 012*/const ( a = iota + 1 // 1 b // 2 c // 3)/*constant 可以跳过*/const ( a = iota + 1 // 1原创 2022-02-15 11:27:19 · 420 阅读 · 1 评论
分享