
Golang
蜗牛你慢点Ⅷ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Golang调度器的设计策略
1 复用线程work stealing 线程偷取其他P的Ghand off 机制 当前M的G阻塞的时候,切换P到其他的M继续执行2 利用并行限定P的个数,每个P的本地队列最多有256个GCPU核心数/23 抢占每个G最多运行10ms超过10ms抢占模式4 全局G队列全局G队列获取时加锁解锁...原创 2021-05-13 18:37:58 · 261 阅读 · 0 评论 -
Go 为什么快
编译型语言直接编译为机器代码执行,不需要虚拟机执行不需要动态检测变量类型支持跨平台编译内存占用低运行时不需要其他环境变量采用紧凑存储,占用空间较小部署简单编译成二进制文件,不需要服务器安装运行环境并发简单语言级别的并发支持线程安全的channel,使共享数据变得简单并发成本低,线程栈空间通常是2M,协程是2KGMP调度模型...原创 2021-04-02 16:20:55 · 238 阅读 · 2 评论 -
Golang Map为什么是无序的
Map无序底层数据 哈希表,本就是无序的,正常写入(非哈希冲突写入):是hash到某一个bucket上,而不是按buckets顺序写入哈希冲突写入:如果存在hash冲突,会写到同一个bucket上。range遍历的时候随机一个位置开始Map扩容成倍扩容: (元素数量/bucket数量) > 6.5时触发成倍扩容,元素顺序变化等量扩容:溢出桶的数量大于等于 2*B时 触发等量扩容,不会改变元素顺序参考文章为什么说Go的Map是无序的?...原创 2021-04-02 11:02:08 · 992 阅读 · 0 评论 -
Golang sync.Once
简介Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配置、保持数据库连接等与init区别init 函数是当所在的 package 首次被加载时执行sync.Once 可以在代码的任意位置初始化和调用,可以延迟到使用时再执行,且并发场景下是线程安全的多数情况下,sync.Once 被用于控制变量的初始化,这个变量的读写满足如下三个条件当且仅当第一次访问某个变量时,进行初始化(写)变量初始化过程中,所有读都被阻塞,直到初始化完成变量仅初始化一次,初始化完成..原创 2021-03-31 17:34:45 · 235 阅读 · 0 评论 -
Golang pprof 工具使用
Golang pprof分析工具使用1. 概述go的pprof工具可以用来监测进程的运行数据,用于监控程序的性能,对内存使用和CPU使用的情况统信息进行分析。官方提供了两个包:runtime/pprof和net/http/pprof,前者用于普通代码的性能分析,后者用于web服务器的性能分析2. runtime/pprof的使用该包提供了一系列用于调试信息的方法,可以很方便的对堆栈进行调试StartCPUProfile:开始监控cpu。StopCPUProfile:停止监控cpu,使用Sta原创 2021-03-30 20:12:50 · 605 阅读 · 0 评论 -
Golang整理
1. go struct能不能比较如果结构体的所有成员变量都是可比较的,那么结构体就可比较如果结构体中存在不可比较的成员变量,那么结构体就不能比较结构体之间能进行强制转换也可以比较。结构体之间进行转换需要他们具备完全相同的成员(字段名、字段类型、字段个数)指针比较实际上是比较指针指向的内存地址,而不是指针变量的内存地址package mainimport "fmt"type Student struct { Name string Age int Slice []int Map原创 2021-03-25 11:48:56 · 150 阅读 · 0 评论 -
线程模型
线程模型一对一:一个用户线程对应一个内核线程多对一:多个用户线程对应一个内核线程多对多:多个用户线程对应多个内核线程Golang 协程协程是用户协作式调用线程是抢占式调度原创 2021-03-24 09:39:19 · 112 阅读 · 0 评论 -
Golang 调度
开始go程序启动,主机上定义的每一个虚拟内核都会为它分配一个逻辑处理器§,每个线程都会分配一个逻辑处理器package mainimport ( "fmt" "runtime")func main() { fmt.Println(runtime.NumCPU()) // MacbookPro 2019 4核心8线程,返回结果8}会为每一个逻辑处理器(P)分配一个M(os线程)线程是OS来处理的,并且OS还负责把线程放置到一个core上去执行每个线程单独连到一个P上Go原创 2021-03-22 18:42:13 · 384 阅读 · 0 评论 -
Golang 操作系统调度入门
操作系统调度操作系统调度器,它负责确保在有线程能够运行的时候内核不会空闲下来。它会制造一种假象——所有能够跑的线程此时都在同时执行。为此,调度器需要优先执行高优先级的线程,但是它也必须保证低优先级的线程不会饿死。调度器也必须尽可能将调度延时压倒最少线程三种状态等待:线程停止并且等待被唤醒。如等待硬件(硬盘、网络),操作系统(系统调用) 或者是同步调用(atomic,mutexes)可执行:线程想要占用内核上的cpu时间来执行分配给线程的指令执行中:线程已经置于内核中,并且正在执行它的机器指令原创 2021-03-22 18:06:35 · 158 阅读 · 0 评论 -
Golang 通过字符串调用方法
package mainimport ( "fmt" "reflect")type Student struct {}func (s *Student) Listen() { fmt.Println("listen")}func main() { student := Student{} value := reflect.ValueOf(&student) f := value.MethodByName("Listen") f.Call([]reflect.Val原创 2021-03-22 09:44:25 · 1317 阅读 · 0 评论 -
Golang type
类型定义和类型别名类型定义:type byte=uint8类型别名:type myInt int命名类型具有名称的类型,例如:int, int64, float32, string, bool通过类型声明创建的所有类型都是命令类型一个命名类型一定和其他类型不同未命名类型组合类型:数组,结构体,指针,函数,接口,切片,map和通道虽然他么没有名字,但却有一个类型字面量来描述他们由什么构成类型字面量:字面量(literal)是用于表达源代码中一个固定值的表示法(notation原创 2021-03-19 11:25:18 · 197 阅读 · 0 评论 -
Go interface 结构
interface类型变量默认值为nilinterface 底层实现iface(no-empty interface) 非空接口,包含方法的接口eface(empty interface) 空接口iface和eface组成type:表示接口的类型描述value: 接口绑定的具体数据efacetype eface struct { _type *_type data unsafe.Pointer}type 负责决定data应该如何解释和操作data 指向具体的实例数转载 2021-03-18 11:46:27 · 214 阅读 · 0 评论 -
Golang相关概念
new和make的区别new 的作用是初始化一个指向类型的指针(*T),使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。make函数的目的与new不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例数组与切片的区别数组 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。原创 2021-03-18 10:34:17 · 284 阅读 · 0 评论 -
设计模式-观察者模式
注意当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知observer.gopackage observerimport ( "fmt" "sync")type Observer inte原创 2021-02-24 17:32:40 · 147 阅读 · 0 评论 -
Golang错误处理
package mainimport (“errors”“fmt”“runtime/debug”)type BaseError struct {InnerError errorMessage stringStackTrace stringMisc map[string]interface{}}func WrapError(err error, message string, messageArgs …interface{}) BaseError {return B原创 2021-02-24 17:26:29 · 315 阅读 · 0 评论 -
Golang runtime运行时
NumCPU NumGoroutine GOOSfunc runtimeInfo() { runtime.GOMAXPROCS(1) fmt.Println(runtime.NumCPU()) // 返回当前cpu核心数 fmt.Println(runtime.NumGoroutine()) // 返回正在执行和排队的任务数 fmt.Println(runtime.GOOS) // 返回当前操作系统}Goschedfunc runtimeGosched() {原创 2021-02-24 17:25:18 · 595 阅读 · 0 评论 -
一个grpcServer实现多个proto文件
一个GRPCServer实现多个proto文件多个proto文件定义在同一个package包中每个proto文件中的service不相同(多个接口)注册GRPCServer的结构体需要实现多个proto文件中定义的接口的方法注册GRPCServer时需要调用每个pb.go文件中的RegisterXXXXServer方法举例第一个proto文件syntax = "proto3";package api;service Decision { rpc Decision(Decis原创 2021-02-24 17:21:01 · 3397 阅读 · 0 评论 -
gin 设置cookie
不知道为什么用gin.Context的SetCookie方法设置不到cookie,有待研究一位伟大的网友记录的方法,学习一下参考链接package mainimport ( "fmt" "github.com/gin-gonic/gin" "net/http" "strconv")func main() { r := gin.Default(...转载 2020-03-07 18:09:15 · 1653 阅读 · 1 评论 -
golang正则表达式入门
package mainimport ( "fmt" "regexp")// 返回字符串中是否包含匹配项func reMatch(){ res , _ := regexp.Match("foo", []byte("foobab")) fmt.Println(res) res, _ = regexp.MatchString("foo", "fooooobaafa") fmt...原创 2020-03-06 15:26:18 · 380 阅读 · 0 评论 -
golang 文件写 入门
ioutilos.OpenFile 记得写完内容后 file.Sync()bufio.NewWriter 写完内容后 writer.Flush()const ( // O_RDONLY, O_WRONLY, or O_RDWR 必须指定 O_RDONLY int = syscall.O_RDONLY // 只读 O_WRONLY int = syscall.O_WRONLY // ...原创 2020-03-06 10:36:41 · 535 阅读 · 0 评论 -
golang 文件读取入门
os.Filebufioioutilpackage mainimport ( "bufio" "bytes" "fmt" "io" "io/ioutil" "os")func readFileStat() { file, err := os.Open("./main.go") if err != nil { fmt.Printf("file open er...原创 2020-03-05 11:37:39 · 271 阅读 · 0 评论 -
Golang panic后获取返回值
宕机后的所有语句不会执行,但是会执行宕机前的defer语句,recover 捕获宕机错误 package main import "fmt" func main() { defer fmt.Println("1111") defer func() { err := recover() fmt.Print...原创 2020-01-16 12:24:35 · 1785 阅读 · 0 评论 -
Golang grpc
安装gRPC运行环境go get google.golang.org/grpc 安装protoc(proto buffer 编译器)官方github安装 protoc-gen-gogo get -a github.com/golang/protobuf/protoc-gen-go编译proto文件 protoc --go_out=plugins=grpc:{输出目录} {...原创 2020-01-16 12:13:32 · 216 阅读 · 0 评论 -
Golang列表操作
package main import "container/list" import "fmt" func main() { l := list.New() // 创建列表 fmt.Println(l) l.PushBack("fist") //在列表尾部插入 l.PushFront(67) // 列表头部插入 ...原创 2020-01-16 12:12:11 · 1032 阅读 · 0 评论 -
Golang随机睡眠
func main() { s := rand.Intn(100) fmt.Println(s) time.Sleep(time.Second * time.Duration(s)) fmt.Println("finish")}原创 2020-01-16 12:10:58 · 2880 阅读 · 0 评论