包含标签 Go 的文章

容器化和kvm的区别

容器和KVM虚拟化是两种不同的虚拟化技术,它们各有优缺点,适用于不同的场景。 容器 容器是一种轻量级的虚拟化技术,利用操作系统层面的虚拟化实现。每个容器都运行在一个独立的命名空间中,可以看作是进程的一个集合,共享主机操作系统的内核。容器可以快速启动、停止和迁移,占用的资源比KVM虚拟……

阅读全文

超时控制下执行函数

go中实现超时控制下执行函数功能 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func RunWithTimeout(fun func() error, timeout time.Duration) error { finished := make(chan struct{}) var err error go func() { err = fun() finished <- struct{}{} }() select { case <-finished: return err case <-time.After(timeout): return fmt.Errorf("timeout") } }……

阅读全文

CNI插件

参考文章:https://developer.aliyun.com/learning/course/572/detail/7866 如何开发自己的CNI插件 CNI插件的实现通常包含两个部分: 一个二进制的CNI插件去配置Pod网卡和IP地址。这一步配置完成后相当于给Pod插上了一条网……

阅读全文

复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1”……

阅读全文

gorm删除记录(删除具有级联关系的数据)

删除具有级联关系的数据 参考:https://gorm.io/zh_CN/docs/associations.html#Association-Mode 带 Select 的删除 你可以在删除记录时通过 Select 来删除具有 has one、has many、many2many 关系的记录,例如: 1 2 3 4 5 6 7 8 9 10 11 12……

阅读全文

go signal处理

Go Signal信号处理 参考: [Go Signal信号处理]((17条消息) Go Signal信号处理_无风的雨-CSDN博客_go signal) 可以先参考官方资料[go.signal](signal package - os/signal - pkg.go.dev) 前言 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯……

阅读全文

Go语言的%d,%p,%v等占位符的使用

1.占位符分别代表了什么? golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。 定义示例类型和变量 1 2 3 4 5 type Human struct { Name string } var people = Human{Name:"zhangsan"} 2 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式。 Printf("%v", people) {zhangsan} %+v 打印结构体时,会添加字段名 Printf("%+v", people) {Name:zhangsan} %#v 相应值的Go语法表示 Printf("#v", people) main.Human{Name:“zhangsan”} %T 相应值的类型的Go语法……

阅读全文

互斥锁

互斥锁 用一个互斥锁来在Go协程间安全的访问数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { var state = make(map[int]int) var mutex = &sync.Mutex{} var ops int64 = 0 for r := 0; r < 100; r++ { // 运行100个go协程来重复读取state go func() { total := 0 for { key……

阅读全文

关于锁的一些注意事项

尽量减少锁的持有时间 细化锁的粒度。通过细化锁的粒度来减少锁的持有时间以及避免在持有锁操作的时候做各种耗时的操作。 不要在持有锁的时候做 IO 操作。尽量只通过持有锁来保护 IO 操作需要的资源而不是 IO 操作本身: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func doSomething() { m.Lock() item := ... http.Get() // 各种耗时的 IO 操作 m.Unlock() } // 改为 func doSomething() { m.Lock()……

阅读全文

学习一下sync.Cond的用法

使用场景: 我需要完成一项任务,但是这项任务需要满足一定条件才可以执行,否则我就等着。 那我可以怎么获取这个条件呢?一种是循环去获取,一种是条件满足的时候通知我就可以了。显然第二种效率高很多。 通知的方式的话,golang里面通知可以用channel的方式 1 2 3 4 5 6 7 var mail = make(chan string) go func() {……

阅读全文