记录一次 内存溢出 and 性能调优的经历
记录一次 内存溢出 and 性能调优的经历
|
后端 |
0 评论
写在前面大家都知道 Golang 是一门带GC的语言。 大多数情况下我们不需要担心内存溢出问题。但是。。。并不代表他完全不会内存溢出,我将之前一个服务进行重构(改了150多个文件) 当我进行灰度发布的时候,发现:居然内存溢出了!左边是重构前的版本,右边是灰度发布版本。 可以清楚看到内存飙升 CPU
golang 协程中使用 context 细节
golang 协程中使用 context 细节
|
后端 |
0 评论
前言为了让我们服务承载更大的并发量,通常我们使用线程来优化自己的代码。线程是cpu的最小调度单位 频繁创建线程 显然是 很大的开销。 于是乎协程诞生了,轻量级线程 可随时切换。 在go 中 协程的 开销非常小 2kb 相比于 java 的 2mb 要小很多。GMP调度模型示例如何开一个携程呢?go
Go代码模板-单例模式
Go代码模板-单例模式
|
写在前面在平时开发中,我们用到最多的 可能就是单例模式了。什么? 你问我单例模式是啥子??A: 你平时是怎么创建对象 的。B: 我还没对象呢,我怎么知道。A: 怎么可能,没对象你写什么Go?B: 我是写C的A: 写C的 gcc开个玩笑。 其实 单例模式说白就是我们的对象实例在整个程序生命周期中只存在
macos 下 goland  # runtime/cgo ld: library not found for -lpthread clang-13: error: linker  问题解决
macos 下 goland # runtime/cgo ld: library not found for -lpthread clang-13: error: linker 问题解决
|
笔记 |
0 评论
问题在使用goland进行debug时,报错 无法进行调试# runtime/cgold: library not found for -lpthreadclang-13: error: linker command failed with exit code 1 (use -v to see in
用go语言实现一个课表推送系统
用go语言实现一个课表推送系统
|
后端 |
0 评论
项目介绍基于 golang 的一个定时消息推送系统。工作原理: CALLBACK流程:系统由 阻塞协程 触发器 任务管理器 三部分组成。实现流程: 务管理内有一个任务列表,通过注册任务,来向任务列表添加任务。然后启动一个阻塞协程去轮询任务列表,并且将当前时间通知到每一个任务。具体触发操作在任务函
go语言-module
go语言-module
|
笔记 |
0 评论
开启goModuleset GO111MODULE=on goproxy设置模块代理加速下载goProxy基本命令go mod init 生成gomod文件go mod download 下载依赖go mod tidy 整理依赖go mod graph 查看依赖go mode edit 编辑mod文
go语言-channel和range,select
go语言-channel和range,select
|
笔记 |
0 评论
channel和rangepackage mainimport "fmt"func main() {c:= make(chan int)go func() {for i:=0;i<3;i++{c<-i}// 当不需要再次发送数据后需要关闭channel,如果被关闭可能
go语言-channel
go语言-channel
|
笔记 |
0 评论
作用goroutine之间互相通信无缓冲channelmake(chan xxx)无缓冲的channel会阻塞,必须等待从channel取出才结束package mainimport "fmt"func main() {// 无缓冲channelc:=make(chan int)
go语言-goroutine
go语言-goroutine
|
笔记 |
0 评论
创建一个协程golang创建协程的关键字是gogo xxxx()package mainimport ("fmt""time")func task(id int) {for {fmt.Println("child task:",id)t
go语言-JSON
go语言-JSON
|
笔记 |
0 评论
json标签type UserInfo struct {Name string `json:"name"`Email string `json:"email"`Password string `json:"password"`
go语言-结构体标签
go语言-结构体标签
|
笔记 |
0 评论
用法type Box struct {Width int `info:"width" desc:"盒子宽度"`Height int `info:"height" desc:"盒子高度"`}通过反射获取package ma
go语言-反射
go语言-反射
|
笔记 |
0 评论
获取类型和值TypeOfValueOfpair<Type,Value>package mainimport ("fmt""reflect")func main() {var num int =10fmt.Println("type:&qu
go语言-interface
go语言-interface
|
笔记 |
0 评论
interface所有类型都实现了 interface{} 接口使用interface可以实现类型断言package mainimport "fmt"// 万能数据类型func Func(arg interface{}) {// 类型断言// xxx.(type)val,ok
go语言-面向对象编程
go语言-面向对象编程
|
笔记 |
0 评论
type给类型起别名 相当于 C的typedefpackage mainimport "fmt"func main() {// 给类型起别名// type 类型名 类型type INT intvar a INTfmt.Println(a)}定义结构体package mainimp
go语言-map
go语言-map
|
笔记 |
0 评论
基本使用make(map[keyType]valueType)package mainimport "fmt"func main() {// map[keyType]valueTypevar m map[string]stringm= make(map[string]stri
go语言-defer
go语言-defer
|
笔记 |
0 评论
用法defer 语句作用在当前函数执行完毕后,依次调用。(方法栈)示例package mainimport "fmt"func do() {defer fmt.Println("Hello:1")defer fmt.Println("Hello:2
go语言-指针
go语言-指针
|
笔记 |
0 评论
概述& 取地址* 取值swappackage mainimport "fmt"func swap(a *int,b*int){t:=*a*a = *b*b =t}func main() {a,b :=10,20fmt.Println("a=",a,&q
go语言-包
go语言-包
|
笔记 |
0 评论
_匿名导包导包时会触发包内 init方法_ import "xxx".将包内方法全部导入使用时不用加包名. import "xxx"别名给导入的包起别名packageName import "xxx"
go语言-函数
go语言-函数
|
笔记 |
0 评论
func 函数名(args...)返回值类型{}无参函数func foo(){fmt.Println("Hello,World!")}有参函数func foo1(a string, b int) int {fmt.Println("a=", a)fmt.Pri
go语言-const和iota
go语言-const和iota
|
笔记 |
0 评论
constgolang里const代表常量package mainimport "fmt"// 常量const STR = "Hello,World!"func main() {// 不可修改// STR="A"fmt.Println(ST