随笔分类 -  《Go》

摘要:Golang-内存逃逸分析在 Go 语言中,内存逃逸分析是编译器的一项重要功能。变量的内存分配位置对程序性能有着重要影响。通常,栈内存的分配和释放速度比堆内存快。如果一个变量在函数调用结束后不再被使用,将其分配在栈上是高效的;但如果函数返回后,该变量依然被其他部分引用,那么它就需要被分配到堆上,这一过程就称为内存逃逸。 内存 阅读全文
posted @ 2023-07-23 10:53 GJH- 阅读(448) 评论(0) 推荐(0)
摘要:Golang-GC(垃圾回收)的工作原理在垃圾回收领域,常见算法有标记清除(Mark - Sweep)和引用计数(Reference Count),Go 语言采用的是标记清除算法,并在此基础上借助三色标记法和写屏障技术提升效率。 标记清除算法基础 标记清除收集器属于跟踪式垃圾收集器,执行过程分为标记(Mark)与清除(Sweep)两个阶段 阅读全文
posted @ 2023-07-21 06:48 GJH- 阅读(22) 评论(0) 推荐(0)
摘要:Go运行报错:undefined: syscall.SIGUSR1报错 解决 修改 go20\src\syscall\types_windows.go 加入一下代码 /** 找到此位置添加如下 */ 16: "SIGUSR1", 17: "SIGUSR2", 18: "SIGTSTP", } /** 兼容windows start */ func Kill(... 阅读全文
posted @ 2023-07-19 01:29 GJH- 阅读(487) 评论(0) 推荐(0)
摘要:介绍 在 Go 语言中,`context` 是一个用于在不同 Goroutine 之间传递请求范围数据、控制请求生命周期和处理取消信号的工具。它提供了一种机制来管理 Goroutine 之间的上下文信息,并允许在请求处理链中传递和取消上下文。 `context` 的主要优点和用途包括 1. 请求范围 阅读全文
posted @ 2023-07-05 05:26 GJH- 阅读(127) 评论(0) 推荐(0)
摘要:特性 一个还未初始化的通道会被预置为nil(编译和运行时不会报错) channel在使用时,需要使用make操作符,make会初始化通道,在内存中分配通道的空间。 引发panic的原因 关闭一个 nil 值 channel 会引发 panic。 package main ​ func main() 阅读全文
posted @ 2023-06-21 22:13 GJH- 阅读(99) 评论(0) 推荐(0)
摘要:Go-Map相关并发 Go中map默认不安全的,也实现了并发安全的对象:sync.Map 和Java的HashMap一样,并发安全的是:ConcurrentHashMap 并发不安全 不安全是因为源码中没有实现读写分离。进行了判断异常: 在哈希表写操作时,会将哈希表的标志位 hashWriting 设置为 1,以表 阅读全文
posted @ 2023-05-31 18:12 GJH- 阅读(118) 评论(0) 推荐(0)
摘要:Go-字典树的实现介绍 Trie(字典树)是一种用于高效存储和查找字符串的数据结构。 Go语言标准库中没有提供Trie树的实现,但是可以使用第三方包来实现Trie树。 下面是Trie的使用方法: 创建Trie树:首先需要创建一个Trie树的根节点,根节点不存储任何字符,只是作为一个起始点。 插入字符串:将字符串中的每 阅读全文
posted @ 2023-04-29 10:54 GJH- 阅读(159) 评论(0) 推荐(1)
摘要:Go-Slice的扩容机制查看Go的不同版本:https://go.googlesource.com/go/+refs 源码位置src/runtime/slice.go :func growslice(xxx) 1.18之前 如果原Slice容量小于1024,则新Slice容量将扩大为原来的2倍; 如果原Slice容量大于等 阅读全文
posted @ 2023-04-29 10:52 GJH- 阅读(190) 评论(0) 推荐(1)
摘要:channel源码地址 /src/runtime/chan.go 导图总结 channel的构成 核心结构:hchan(缓冲区 / 队列 / 锁 / 元信息)、sudog(关联 goroutine 与数据)、waitq(管理 sudog 的双向链表)、mutex(并发安全)。 核心方法:makech 阅读全文
posted @ 2023-04-26 01:23 GJH- 阅读(15) 评论(0) 推荐(0)
摘要:Go-GMP调度用户态线程 GMP 在1.2版本之前是没有p的概念的 只有 MG Go 语言基于 GMP 模型实现用户态线程(协程) G:表示 goroutine,每个 goroutine 都有自己的栈空间,定时器初始化的栈空间在 2k 左右,空间会随着需求增长。 M:表示 Machine,抽象化代表内核线程,记录 阅读全文
posted @ 2023-04-20 15:06 GJH- 阅读(123) 评论(0) 推荐(1)
摘要:Go中提供了网络编程接口支持HTTP、TCP、UDP协议等,下面演示下TCP通信Server、Client Server package main import ( "fmt" "net" ) func main() { // 创建一个 TCP 监听器 listener, err := net.Li 阅读全文
posted @ 2023-04-03 15:20 GJH- 阅读(120) 评论(0) 推荐(0)
摘要:Go-Interface在 Golang 中接口(interface)是一种类型,一种抽象的类型。接口(interface)是一组函数 method (方法)的集合,Golang 中的接口不能包含任何变量。 在 Golang 中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定义规范不实现。接口体现了程序设计 阅读全文
posted @ 2023-03-30 02:41 GJH- 阅读(42) 评论(0) 推荐(0)
摘要:Go-Mutex(互斥锁)解读互斥锁是并发程序中对共享资源进行访问控制的主要手段,Go提供了Mutex(互斥锁)结构体类型 并且使用简单:对外暴露两个方法 Lock() 和 Unlock() 分别用于加锁和解锁 1.Mutex使用 开启10个Goroutine来计算count的结果 package main import ( " 阅读全文
posted @ 2023-03-21 15:00 GJH- 阅读(139) 评论(0) 推荐(0)
摘要:Go-方法接收器Go中分为2种接收器:指针类型、非指针类型 指针类型接收器 package main import "fmt" type Property struct { value int } func (p *Property) SetValue(v int) { p.value = v } func (p 阅读全文
posted @ 2022-09-10 22:35 GJH- 阅读(44) 评论(0) 推荐(0)
摘要:内联函数(Inline Function)是一种编译器优化技术,它将函数调用处直接替换为函数体,以减少函数调用的开销和提高程序的执行效率。下面是一个简单的示例来说明内联函数的概念: package main import "fmt" // 定义一个简单的加法函数 func add(a, b int) 阅读全文
posted @ 2022-09-02 18:16 GJH- 阅读(61) 评论(0) 推荐(0)
摘要:在 Go 中,可以使用操作系统的信号来实现优雅的启动和停止。具体来说,可以在程序中监听 SIGINT 和 SIGTERM 信号,在接收到这两个信号时,优雅地关闭程序。 下面是一个简单的示例: package main import ( "fmt" "os" "os/signal" "syscall" 阅读全文
posted @ 2022-08-31 20:35 GJH- 阅读(165) 评论(0) 推荐(0)
摘要:Go-Goroutine&Channelgoroutine(协程) package main import ( "fmt" "sync" "time" ) // 声明goroutine 计数器 var wg sync.WaitGroup func test() { defer wg.Done() //// goroutine 结束就登记- 阅读全文
posted @ 2020-01-17 09:49 GJH- 阅读(101) 评论(0) 推荐(1)
摘要:Gin框架使用开启go mod 设置代理 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct 安装Gin mkdir gin cd gin go mod init HelloGin go get -u github.com/gi 阅读全文
posted @ 2020-01-16 17:05 GJH- 阅读(61) 评论(0) 推荐(1)
摘要:Go-时间处理在线转换工具 重新整理 获取当前时间戳 fmt.Println(time.Now().Unix()) // 当前时间戳 1691844553 fmt.Println(int64(time.Now().Unix())) // 1691845792 获取6天前的时间戳 fmt.Println(time. 阅读全文
posted @ 2019-12-27 09:50 GJH- 阅读(60) 评论(1) 推荐(1)
摘要:Go-高效字符串连接Go中可以使用“+”合并字符串,但是这种合并方式效率非常低,每合并一次,都是创建一个新的字符串,就必须遍历复制一次字符串。 建议: 1.10 之前版本使用 bytes.Buffer 1.10+ 以后版本使用 strings.Builder(Go1.10以后出现的) package main impo 阅读全文
posted @ 2019-12-26 17:58 GJH- 阅读(73) 评论(0) 推荐(1)