go
文章平均质量分 65
golang技术
Mars'Ares
梦想需要坚持
展开
-
解决 golang 实现json序列化调用原生序列化stack溢出问题
实现json序列化再调用原生序列化stack溢出原创 2022-10-24 14:12:20 · 631 阅读 · 0 评论 -
常见数据结构(go 简易实现)
文章目录线性结构数组链表逻辑结构栈特性应用简易实现队列特性应用简易实现哈希表简易实现非线形结构树二叉树分类遍历二叉堆图线性结构数组内存中顺序存储有序元素特性:随机访问高效,适合读多写少插入删除需要移动元素,可能遇到扩容操作操作描述时间复杂度查询下标访问,随机读取O(1)更新下标访问,随机读取,赋值O(1)插入尾部插入中间插入,后面元素右移超范围插入,触发扩容copy综合O(N)O(1)O(N)O(N)删除尾部删除中间删除,后面元素左移原创 2022-05-26 22:33:44 · 980 阅读 · 0 评论 -
golang 深入学习总汇
文章目录前言基础篇golang简介golang环境搭建wingolang常用配置golang多版本macgolang语法golang变量常量golang运算符golang流程控制golang函数golang错误处理进阶篇golang数据类型golang反射golang面向对象golang并发编程golang内存管理应用篇前言文章以golang1.16源码作为参考仅个人阅读笔记,欢迎批评指正持续更新中基础篇golang简介golang环境搭建wingolang常用配置golang多版本m原创 2022-05-19 00:45:45 · 669 阅读 · 0 评论 -
golang 垃圾回收
文章目录垃圾回收算法STW标记清除法(mark-sweep)三色标记法垃圾回收算法STW暂停程序(Stop the world,STW)随着用户程序申请越来越多的内存,系统中的垃圾也逐渐增多;当程序的内存占用达到一定阈值时,整个应用程序就会全部暂停,垃圾收集器会扫描已经分配的所有对象并回收不再使用的内存空间,当这个过程结束后,用户程序才可以继续执行标记清除法(mark-sweep)标记根对象出发标记堆中所有存活对象下图A/C/D存活 B/E/F不可以达清除遍历堆中所原创 2022-05-19 00:29:41 · 245 阅读 · 0 评论 -
golang 内存管理
文章目录内存管理内存分配器线性分配(Bump Allocator)空闲链表分配(Free-List Allocator)线程缓存分配 (Thread-Caching Malloc,TCMalloc)对象大小多级缓存地址空间状态转移内存对齐结构体内存逃逸逃逸机制逃逸分析总结go 内存管理虚拟内存布局go内存管理设计mspanmcachemcentralmheap内存分配内存管理内存分配器线性分配(Bump Allocator)指针指向空闲内存地址,修改更新指针来分配下一个内存地址。复杂度低,执行效原创 2022-05-19 00:28:28 · 910 阅读 · 0 评论 -
golang 并发编程
文章目录知识点并发并行进程线程协程通信模型CSP communicating sequential processshare memory线程模型1. 用户级线程模型M:12. 内核级线程模型1:13. 两级线程模型M:N调度 GPM调度策略源码分析触发调度线程启动协程执行结束主动挂起系统调用协作式调度系统监控协程 goroutine对比状态转移源码分析使用通道 channel源码分析使用同步 sync互斥锁 mutex锁模式锁状态上锁解锁读写锁 RWMutex知识点并发多线程程序在一个cpu上调度交原创 2022-05-19 00:24:29 · 1131 阅读 · 0 评论 -
golang 反射
文章目录反射反射类型反射对象反射种类使用场景接口结构体指针函数反射reflect实现了运行时的反射能力,能够让程序操作不同类型的对象。三大原则:inserface{}变量可以反射出对象反射对象可以获取interface{}变量修改反射对象,其值必须被设置反射类型//reflect/type.gotype Type interface { // 该类型内存分配大小(内存对齐单位子节) Align() int // 该类型作为结构体字段时内存分配大小(内存对齐单位子节原创 2022-05-18 17:29:27 · 240 阅读 · 0 评论 -
golang 错误处理
文章目录error使用规约panic使用规约recover使用规约error//零值为nil 引用类型////零值为无错误////有值为包含错误//error接口type error interface { Error() string}//errorsfunc New(text sring) error//fmtfunc Errorf(format string,a ...interface{}) error使用规约error建议放在返回最后面多次重试可原创 2022-05-18 17:26:06 · 168 阅读 · 0 评论 -
golang 面向对象
文章目录面向对象特性封装继承多态结构体空结构体struct定义成员方法定义结构体嵌套(继承)可见性就近原则接口空接口interface定义interface实现和继承interface多态类型断言多态结构体切片排序总结面向对象特性封装隐藏对象的属性和实现细节,仅对外公开可控成员方法。主要通过结构体和方法访问可见性进行封装继承子类继承父类的所有特征和行为。主要通过结构体组合实现继承的效果多态同一类对象表现出不一样的具体实现。主要通过结构体实现接口,通过接口指针指向不同实现接口的结构体实例达到多态原创 2022-05-18 17:24:54 · 829 阅读 · 0 评论 -
golang 函数
目录函数定义参数位置参数默认值/可选参数关键字参数可变参数参数传递值传递引用传递(地址拷贝)返回值多个返回值返回值命名注意项匿名函数特殊函数initmain内置函数defer执行顺序1. defer是LIFO,类似堆栈方式运行的2. return与defer同时出现时,defer只有被return包裹才会运行3. return变量时,并不是原子操作,分为赋值 + 返回,如果有defer将在赋值与返回间执行panicrecoverprintprinlncaplenappendcopyclosedeletema原创 2022-05-18 17:22:17 · 871 阅读 · 0 评论 -
golang 流程控制
文章目录分支ifif...elseif..else if ...elseswitchfallthrough循环forrangewhile?do?breakcontinuegotoselect分支if//if 中可以直接定义变量if 布尔表达式 { /* 在布尔表达式为 true 时执行 */} //例子age := 0_, _ = fmt.Scanln(&age)if age > 18{ fmt.Println("对自己负责")}if s:="呀";age>原创 2022-05-18 17:19:25 · 419 阅读 · 0 评论 -
golang 运算符
文章目录简介算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符优先级简介运算符用于在程序运行时执行数学或逻辑运算。Go 语言内置的运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符算术运算符运算符描述+相加-相减*相乘/相除(保留整数)%求余// /有浮点型参与运算时会保留小数,10.0/4 结果为2.5A,B := 10,20fmt.Println(A+B) //30fmt.Printl原创 2022-05-18 17:17:17 · 298 阅读 · 0 评论 -
golang 变量常量
文章目录变量作用域声明初始化赋值常量缺省iota计数器变量语言变量名满足(标识符规则)由字母、数字、下划线组成,其中首个字符不能为数字使用 var 关键字声明,同作用域内不能重复声明变量初始化零值表类型类型零值bool布尔类型falseint整数0float浮点0.0string字符串“”pointer, function, interface, slice, channel, map引用类型nilarray, s原创 2022-05-18 17:14:38 · 122 阅读 · 0 评论 -
golang 数据类型
文章目录内置类型值类型内置常量引用类型内置函数内置接口数据类型基本类型整型浮点型布尔型字符和字符串字符字符串类型转换派生类型数组 array多维数组切片 slice哈希表 map指针类型 pointer声明取指针内存类型判断comma-ok断言type - switch内置类型定义在builtin/builtin.go值类型 bool int int8, int16, int32(rune), int64 uint uint8(byte), uint16, uint32, u原创 2022-05-18 17:12:24 · 910 阅读 · 0 评论 -
golang 语法
文章目录GO代码行分隔符注释关键字标识符包管理可见性GO代码go后缀文件//go 编译器 cmd/compile/internal/gc/main.go 1.通过词法分析获取所有程序token2.通过语法分析生成抽象语法树(AST)3.遍历检查抽象语法树,检查过程中改替换部分代码为内建函数4.编译检查通过抽象语法树,生成中间代码。6.执行优化中间代码并生成机器码词法分析由关键字/标识符/数字/字符串/字符/注释组成//go程序由关键字/标识符/常量/字符串/符号/注释imp原创 2022-05-18 16:27:06 · 194 阅读 · 0 评论 -
golang 简介
文章目录背景诞生优势特色特征对比背景硬件技术更新快,性能逐步提高,现有的主流编程不能合理利用多核多cpu的优势。软件系统复杂,维护成本高,缺乏一个足够简洁高效编程语言。风格不一计算力不够并发支持不友好c/c++项目编译慢(静态编译),存在内存泄露问题诞生思想**less can be more** 大道至简才是最难的创始人Ken Thompson(肯·汤普逊):1983年图灵奖、1998年美国国家技术奖得主,他与Dennis Ritchie是Unix系统的原创者。Thom原创 2022-05-18 16:24:14 · 370 阅读 · 0 评论 -
golang 常用配置
文章目录前言环境变量开发配置交叉编译maclinuxwin前言记录一些常用环境变量配置或者命令,提高开发效率环境变量软件基础环境变量# linux 修改环境变量vim /etc/profile # 必要配置export GOROOT="/usr/local/go" # go安装位置export PATH=$PATH:$GOROOT/bin # go可执行文件加入全局# 非必要配置export GOPATH="/home/mygo" # 项目位置export PATH=$P原创 2021-11-28 18:29:59 · 1353 阅读 · 0 评论 -
golang 多版本管理(mac)
目录前文golangIDE(推荐)step1 下载gostep2 指定go 版本使用gvmstep0 常用命令step1 下载gvmstep2 使用gvm前文基于gomod管理后,经常出现需要多个版本的go进行代码构建。如果仅仅是为了编译,个人推荐使用docker进行交叉编译即可;如果是为了本地调试运行,可以参考一下方式golangIDE(推荐)原理: 指定go版本左右软件环境的goroot,替代系统环境gorootstep1 下载gofile->other settings-&g原创 2021-11-15 21:38:02 · 3840 阅读 · 0 评论 -
解决golang test出现# command-line-arguments [command-line-arguments.test]报错
项目场景:xxx.go xxx_test.go 单元测试和代码分开放,代码不在gopath中以及idea设置的项目根中。背景:gopath: /Users/zyj/go 项目根:/Users/zyj/study/demo go源文件:/Users/zyj/study/demo/go/src/xxx_test.go问题描述:xxx.go xxx_test.go分开存放 xxx_test.go 编译报错command-line-arguments [command-line...原创 2021-10-05 00:19:09 · 5237 阅读 · 4 评论 -
redis+lua实现原子库存增减
目录背景分析为何需要锁?原子操作为那几步?如何实现原子操作?实现go实现总结背景高并发场景下,设计订单系统时,常遇到写写/读写/写读并发冲突导致的脏读,容易引起的超卖问题。通常方案:使用锁包裹非原子语句集来保证并发读写一致性,但锁的存在牺牲了其并发性能。以订单扣减为例:伪代码:## step1 查询库存 do get## step2 库存判断 do check and pass## step3 当前库存-1 do sub## step4 创建订单 do others并发情况原创 2021-08-24 01:25:48 · 1360 阅读 · 0 评论 -
golang中defer与return的执行顺序
这里写目录标题1. defer是LIFO,类似堆栈方式运行的2. return与defer同时出现时,defer只有被return包裹才会运行3. return变量时,并不是原子操作,分为赋值 + 返回,如果有defer将在赋值与返回间执行匿名返回值有名返回值有名返回值临时赋值1. defer是LIFO,类似堆栈方式运行的示例func test(){ defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) return}原创 2020-07-23 11:25:19 · 2480 阅读 · 0 评论 -
go扩展ticker实现优雅起停
go扩展ticker实现优雅起停ticker源码分析关键源码ticker核心源码startTimer stopTimer sentTime 核心源码源码解读原理注意事项ticker优化关闭思路MyTicker代码代码代码效果ticker源码分析关键源码ticker核心源码package timeimport "errors"type Ticker struct { C <-chan Time r runtimeTimer}func NewTicker(d Duratio原创 2020-07-18 23:20:28 · 951 阅读 · 3 评论 -
golang json传递time类型参数
目录一 前言二实现三 验证四 总结一 前言golang的强制类型转换可以让人抓狂,遇上json序列化/反序列化时候的时间类型参数,需要不断的转换参数类型,简直让人抓狂。 本文通过组合方式对时间类型进行拓展,并实现序列化/反序列化接口来解决时间json传递类型转换问题。二实现自定义jsonTime,时间格式以"2006-01-02 15:04:05" 为例const ( YYYYMMDDHHMISS = "2006-01-02 15:04:05" //常规类型...原创 2020-05-26 20:40:52 · 3195 阅读 · 0 评论 -
go实现定时周期
一、前言1、go有现成的周期定时器和定时器,但是没有定时周期2、基于在未来某个时刻后进行周期循环,于是有了定时周期3、本文秒级精度的定时器,存在几个指令时间的误差二、实现1、基础代码package timerimport ( "time")//阻塞循环定时器func tickerDone(interval int, function func()) {...原创 2019-10-24 18:43:59 · 1309 阅读 · 0 评论 -
golang依赖管理 glide
目录一、gilde简介二、glide命令简介三、gilde安装配置step1:下载安装gildestep2:使用gildestep3:根据gilde安装依赖到vendor四、gilde官方bugbug1:windows使用gilde get报错bug2:gilde install 或者 gilde get失败五、gilde常用命令初始化gilde...原创 2019-10-04 16:40:24 · 1357 阅读 · 2 评论 -
golang依赖管理 govendor
目录一 、govendor简介二、govendor命令简介主命令子参数三、govendor安装配置step0:环境准备step1:安装下载govendorstep2:使用govendorstep3:常用命令组合一 、govendor简介vendor是go的一个目录形式的包管理工具,而govendor结合了vendor这机制,扩展了功能:支持分析...原创 2019-10-03 19:56:22 · 760 阅读 · 0 评论 -
golang官方依赖管理go module(vgo)简单使用
目录一 、VGO简介二 、命令简介三 、配置VGO方式一:传统方式方式二:GOLANG-IDE插件支持step1:下载安装step2:设置vgo四 、使用vgostep1:创建项目并创建gomodstep2:初始化gomod文件step3:解析依赖step4:如果有第三方库,无法下载可以使用go.mod中的replace来解释require指定,例如...原创 2019-10-03 13:10:30 · 5839 阅读 · 0 评论 -
golang解决go get命令无响应问题
操作go get -v github.com/golang/net现象go get github.com/golang/net: module github.com/golang/net: Get https://proxy.golang.org/github.com/golang/net/@v/list: dial tcp 216.58.220.209:443: connec...原创 2019-10-01 18:03:01 · 52019 阅读 · 8 评论 -
golang开发环境搭建(windows)
目录一、安装golangstep1:下载golangstep2:无脑安装即可step3:设置环境变量step4:验证环境变量step5:工程化项目目录二 、安装IDE jetbrains-Golangstep1:下载2018版jetbrainsGolangstep2:软件无脑安装即可step3:注册码,亲测有用,有效至2099年step4:设置ID...原创 2019-10-01 14:13:42 · 1120 阅读 · 0 评论