Golang
文章平均质量分 62
Golang
Mark66890620
这个作者很懒,什么都没留下…
展开
-
Goland 报错:Found several package
安装了GoLand 2020.1,但是go安装了最新版的go 1.18版本后,Goland 报错:Found several package。原因是GoLand版本太低了,需要升级到最新版本,但是因GoLand无法升级,只能把go 1.18卸载掉(直接删除安装目录即可),重新安装go 1.16版本后,报错消失。...原创 2022-05-16 22:57:37 · 5207 阅读 · 2 评论 -
Go 语言的字串数据类型 String
Go 中的字符串值得特别关注,因为与其他语言相比,Go 中的字符串实现方式是非常不同的。GO 中字符串定义在双引号 "......" 之间,而不是单引号,与 JavaScript 不同。 Go 中的字符串是 ** UTF-8 ** 默认编码 这在 21 世纪的今天是非常有意义的。 由于 UTF-8 支持 ASCII字符集,因此在大多数情况下您无需担心编码问题。 但要深入了解 UTF-8 编码的工作原理,您一定要访问 这个维基百科页面。先来写一个简单的程序。使用 string 关键字来定义 s转载 2022-05-15 22:41:14 · 1891 阅读 · 0 评论 -
Go字符串使用for range循环和用for循环不一样踩的坑
func main(){ s:="abcd" fmt.Printf("%T\n",s[0]) //s[i]的类型为uint8 for i:=0;i<len(s);i++{ fmt.Printf("%T\n",s[i]) } //s[i]的类型为uint8 for _,v:=range s{ fmt.Printf("%T\n",v) } //v的类型为int32}相同字符串在使用不同遍历方式的时候,类型是不一样的.使用普通循环时,得到的类型是uin.原创 2022-05-15 22:01:42 · 577 阅读 · 0 评论 -
【无标题】
疑问1:从已关闭的channel读取数据会怎么样?疑问2:重复关闭chan会怎么样?疑问3:向关闭的chan发送信号会怎样? 疑问1:从已关闭的channel读取数据会怎么样 刚接触go的channel,我在思考一个问题,chan是发送方关闭,还是接收方关闭,如果是发送方关闭,发送方发完数据,就关闭chan,那可能接收方还没接收完数据,读取关闭的信道会怎样? 验证1:有缓冲 package main import ( ...转载 2022-04-06 20:28:39 · 83 阅读 · 0 评论 -
Go channel的使用场景,用法总结
在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。channel的使用场景把channel用在数据流动的地方:消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ...channel的基本操作和注意事项channel存在3种状态:nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭chann转载 2022-04-06 20:13:42 · 2362 阅读 · 0 评论 -
Golang slice往中部添加元素的三种方式
场景如下,有一个切片:a = []int{1,2,4,5,6},想在中部添加一个元素,使得a = []int{1,2,3,4,5,6},有三种方式:1.创建临时切片:var a = []int{1,2,4,5,6}var b= a[2:]b = append([]int{3},b[0:]...)a=append(a[0:2],b...)2.利用append支持链式操作的特性:.var a = []int{1,2,4,5,6}a=append(a[:2],append([]int转载 2022-03-31 19:37:43 · 1990 阅读 · 0 评论 -
Golang panic 与 recover
概念 panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误,panic 用于主动抛出错误,recover 用来捕获 panic 抛出的错误。 引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。 发生panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。...转载 2022-03-29 19:07:07 · 1128 阅读 · 0 评论 -
Golang 为什么slice和map是线程不安全的?
来源:为何 Go map 和 slice 是非线程安全的? - 尚码园转载 2022-03-29 18:49:41 · 554 阅读 · 0 评论 -
goland快捷键大全
快捷键 作用 备注ctrl + n 导航到类名ctrl + shift + n 导航到文件ctrl + e/ctrl + shift + e 打开到最近的文件/打开最近修改的文件ctrl + shift + i 简短地查看源定义ctrl + alt + m 重构表达式为函数 光标在表达式的末尾ctrl + space 快速返回实现 return 字段后使用ctrl+ shift+ a 工具调用 如 go tools,restful 等ctrl + shift + space转载 2022-03-28 18:04:28 · 2176 阅读 · 0 评论 -
Go 实战Go内存泄漏,pprof定位内存泄漏问题
引言: 最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露问题。 关于Go的内存泄露有这么一句话不知道你听过没有: 10次内存泄露,有9次是goroutine泄露。 我所解决的问题,也是goroutine泄露导致的内存泄露,所以这篇文章主要介绍Go程序的goroutine泄露,掌握了如何定位和解决goroutine泄露,...转载 2022-03-28 16:37:20 · 7695 阅读 · 0 评论 -
gin源码解析?什么是字典树?
介绍 gin 框架 基于 httprouter 实现最重要的路由模块,采用类似字典树一样的数据结构来存储路由与handle方法的映射.也是框架高性能的原因,有兴趣的同学可以自行查阅 本文提供 在线思维导图 搭配文章看事半功倍 Engine 容器对象,整个框架的基础 Engine.trees 负责存储路由和handle方法的映射,采用类似字典树的结构 Engine.RouterGroup,其中的Handlers存储着所有中间件 Context上下文对...转载 2022-03-28 12:37:47 · 174 阅读 · 0 评论 -
ACID是什么?常见的分布式算法有哪些?raft算法和Paxos比较?
ACID是什么?ACID 是数据库事务正确执行的四个基本要素的缩写。为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事原创 2022-03-28 12:07:21 · 2026 阅读 · 0 评论 -
Golang GC探秘:写屏障是什么?
参考:Go 语言垃圾收集器的实现原理 | Go 语言设计与实现由于Golang的GC机制一直在持续迭代,本文叙述的主要是Go1.9版本及以后的GC机制,该版本中Golang引入了 混合写屏障大幅度地优化了STW的时间。具体GC机制的版本迭代可以参考 :GC的过去、现在和未来基本概念GC的对象不再被需要的内存块,如果无法回收这部分内存将无法重复使用内存泄漏不再被需要的内存块,未在预期时间以内被回收的称为内存泄漏常见的GC方法:1.【PHP,Swift,Python等】引用计数.转载 2022-03-28 00:22:35 · 1557 阅读 · 0 评论 -
Go语言之 pprof
参考:深度解密Go语言之 pprof - Stefno - 博客园参考:https://www.jianshu.com/p/4e4ff6be6af9想做性能分析PProf想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下:runtime/pprof:采集程序(非 Server)的运行数据进行分析 net/http/pprof:采集 HTTP Server 的运行时数据进行分析是什么pprof 是用于可视化和分析性能转载 2022-03-27 23:53:27 · 127 阅读 · 0 评论 -
Golang的runtime
runtime包含Go运行时的系统交互的操作,例如控制goruntine的功能。还有debug,pprof进行排查问题和运行时性能分析,tracer来抓取异常事件信息,如 goroutine的创建,加锁解锁状态,系统调用进入推出和锁定还有GC相关的事件,堆栈大小的改变以及进程的退出和开始事件等等;race进行竞态关系检查以及CGO的实现。总的来说运行时是调度器和GC,也是本文主要内容。scheduler首先说到调度,我们学习操作系统时知道,对于CPU时间片的调度,是系统的资源分配策略,如任务A在转载 2022-03-24 11:54:10 · 1528 阅读 · 0 评论 -
Golang gopark函数和goready函数原理分析
Golang-gopark函数和goready函数原理分析gopark函数goready函数前面介绍的scheduler和channel里面都与gopark和goready这两个函数紧密相关,但是站在上层可以理解这两个函数的作用,但是出于对源码探索,我们要明白这两个函数不仅仅做了啥,还要知道怎么做的。本文主要内容是从底层源码分析这两个函数原理:gopark函数goready函数gopark函数gopark函数在协程的实现上扮演着非常重要的角色,用于协程的切换,协程切换的原因一般有以下几种情况转载 2022-03-24 10:17:58 · 2087 阅读 · 1 评论 -
Golang中 context作用,原理,超时控制
什么是context从go1.7开始,golang.org/x/net/context包正式作为context包进入了标准库。那么,这个包到底是做什么的呢?根据官方的文档说明:Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes.转载 2022-03-24 09:53:45 · 816 阅读 · 0 评论 -
Golang调度器的GMP模型,GMP模型里为什么要有P?并行和并发,进程、线程和协程概念
并行(parallel): 物理上同一时间处理不同任务并发(concurrent): 逻辑上处理同时的任务的能力通常所说的并发编程,也就是说它允许多个任务同时执行,但实际上并不一定在同一时刻被执行。在单核处理器上,通过多线程共享CPU时间片串行执行(并发非并行)。而并行则依赖于多核处理器等物理资源,让多个任务可以实现并行执行(并发且并行)。对于用户层面来说,进程就是一块运行起来的程序,线程就是程序里的一些并发的功能。对于操作系统层面来说,标准回答是“进程是资源分配的最小单位,线程是...转载 2022-03-23 10:48:42 · 1132 阅读 · 0 评论 -
go 栈内存和堆内存概念以及内存逃逸分析
为了让程序员更好地专注于业务代码的实现,Go 语言增加了垃圾回收机制,自动地回收不再使用的内存。Go 语言有两部分内存空间:栈内存和堆内存。1. 栈内存栈只允许往线性表的一端放入数据,之后在这一端取出数据,按照后进先出(LIFO, Last In First Out )的顺序,如图所示。往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部,最先放入的元素总是位于栈的底部。从栈中取出元素时,只能从栈顶部取出。取出元素后,栈的数量会变少。最先放入的元素总是最后被取出转载 2021-12-30 17:29:56 · 1260 阅读 · 0 评论 -
Golang对某一字符串排序
方法一:首先,字符串转为[]byte, 对切片排序, 最后切片转字符串str := "eat"b := []byte(str)sort.Slice(b, func(i, j int) bool { return b[i] < b[j]})str = string(b)方法二:首先字符串分割,得到字符串切片, 对切片排序, strings.join连接成新的字符串func sortString(str string) string { split := strings转载 2022-03-07 14:40:34 · 1195 阅读 · 0 评论 -
【golang】 slice 切片深度解析,踩坑记录
Go 语言的 slice 很好用,不过也有一些坑。在初学golang中,作者也在slice上踩了很多坑。为了避免以后继续踩坑,也为了能够更加深入了解slice的原理,于是有了本文。可以先看下以下几个案例,如果你可以正确回答,并且能够说出为什么,那么恭喜你,你对slice已经很了解了。案例一(slice传参)://情况一func main() { slice := make([]int,0,4) slice = append(slice,1,2,3) TestSlice(slice)转载 2021-12-09 15:20:10 · 885 阅读 · 1 评论 -
创建三个goroutine,分别输出1 4 7, 2 5 8, 3 6 9, ...... 100, 保证顺序输出1到100, 2种方法
方法一:var wg sync.WaitGroupfunc r(start int, ch1, ch2 chan int) { defer wg.Done() for i := start; i <= 101; { num, ok := <-ch1 if !ok { close(ch2) break } fmt.Println(num) ch2 <- i i = i + 3 }}func main() { ch1, ch2, ch原创 2021-12-08 14:13:57 · 453 阅读 · 0 评论 -
golang跳出for select 循环,需要break配合标签才行
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break并不能跳出循环。func testSelectFor(chExit chan bool){ for { select { case v, ok := <-chExit: if !ok { fmt.Println("close channel 1", v) break } fmt.Println("ch1 val =", v) } } f转载 2021-12-03 11:04:25 · 3166 阅读 · 0 评论 -
golang 语言基础之字符串遍历
Go的字符串遍历,有两种方式:utf-8遍历 unicode遍历package mainimport "fmt"func main() { str := "Hello,世界" fmt.Println("Utf-8遍历") for i := 0; i < len(str); i++ { ch := str[i] fmt.Println(ch) } fmt.Println("Unicode遍历") for _转载 2021-12-22 16:52:27 · 3686 阅读 · 0 评论 -
Go 语言中如何比较两个map[string]interface{}是否相等
Go语言中Map是无序的再Go语言中,Map是一个内置类型,它将键与值绑定在一起,可以通过键获取响应的值。由于Go Map内部不存储机制是以key为hash的结构来实现的,所以顺序是混乱的。举例说明:在两次遍历中读取数据的顺序是不一样的。func main() { a := map[string]interface{}{ "orange": "1", "apple": "2", "banana": "3", } fmt.Println("第一遍:") for k, v :转载 2021-12-22 17:51:20 · 1126 阅读 · 0 评论 -
go 判断两个 slice/struct/map 是否相等
可以通过reflect.DeepEqual比较两个 slice/struct/map 是否相等:package main import ( "fmt" "reflect") type A struct { s string} func main() { a1 := A{s: "abc"} a2 := A{s: "abc"} if reflect.DeepEqual(a1, a2) { fmt.Println(a1,..转载 2021-12-22 17:35:09 · 324 阅读 · 0 评论 -
Golang语言的指针类型有什么作用?
概念和意义的解析GO菜鸟教程对指针的解释:一个指针变量指向了一个值的内存地址。Golang语言的指针类型有什么作用:1)指针类型用于传递地址, 而不是传递值, 因为 golang 的函数, 所有的参数都是传递一个复制的值. 如果值的体积过大, 那么就会严重降低效率, 而传递一个地址, 就会大大提高效率. 另外传递指针也能让 go 函数实现对变量值的修改.2)如果一个复杂类型的值被传递了若干次后, 和自己比较, 虽然用于保存的容器和名称变了, 但用于保存值的地址不变, 这个时候, 只要使用指针转载 2022-02-09 09:46:06 · 803 阅读 · 0 评论 -
Golang中 map的key可以用数组array类型吗?map的key可以用切片slice类型吗?为什么slice、map、function不能直接用==比较?
golang 中 map 的 key 必须是可以比较的,再简单点也就是说,map的key是可以使用 == 运算符进行比较的。因slice,map,function 不可以比较,所以不能作为key所以 数字、string、bool、array数组、channel、指针可以,以及 包含前面类型的 struct。...原创 2022-01-06 09:46:22 · 2443 阅读 · 2 评论 -
Golang空结构体struct{}用途,你知晓么?
空结构体的特点和作用参考代码package main import ( "fmt" "unsafe") func main() { empStruct()} //空结构体的实例和作用func empStruct(){ //空结构体的特点:1、不占用内存;2、地址不变 var s struct{} var s1 struct{} fmt.Println("空结构体占用内存的情况:",unsafe.Sizeof(s))转载 2022-02-09 15:26:39 · 663 阅读 · 0 评论 -
go GC垃圾回收机制
谈go语言gc之前,先了解一下基础概念一个标准进程的内存模型code area(方法区) static area 静态变量 heap (堆) stack (栈)golang程序,是一个进程;一个进程对应着多个OS线程,又根据MPG模型,对应着很多个协程;对所有的goroutinue来说,heap可以看作是共享的区域;但是每个goroutinue,都有只属于自己的stack;一般程序的内存管理stack会随着线程执行code area的stack frame翻译 2021-12-31 15:08:59 · 209 阅读 · 0 评论 -
Golang 什么是协程泄露(Goroutine Leak)?
概述在Go中,goroutine很轻量级,随便创建成千上万个goroutine不是问题,但要注意,要是这么多的goroutine一致递增,而不退出,不释放资源,就有可能耗尽系统资源。本文介绍goroutine泄露的两种实际场景,并讨论如何解决该问题。其他场景和更加详细的介绍,可以参考我的个人博客。产生原因分析产生goroutine leak(协程泄露)的原因可能有以下几种:goroutine由于channel的读/写端退出而一直阻塞,导致goroutine一直占用资源,而无法退出gorou转载 2022-02-09 11:00:13 · 1870 阅读 · 0 评论 -
Golang 泛型要来了吗?
参考:【Golang】泛型要来了吗? - 知乎1. 泛型是什么?2. 目前有什么痛点呢?3. Go的泛型如何使用?4. 基于泛型实现的缓存是什么样子的?5. 有了泛型还需要interface{}吗?6. Go1.17的泛型为什么不能从本包导出?1. 泛型是什么?泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译转载 2022-01-07 09:55:30 · 161 阅读 · 0 评论 -
Golang 语言中new()和 make()的区别详解
参考:https://www.jb51.net/article/56837.htm概述Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。new 的主要特性首先 new 是内建函数,你可以从http://golang.org/pkg/builtin/#new这儿看到它,它的定义也很简单:复制代码代码如下:func new(Type) *Type官方文档对于它的描述是:复制代码代码如下:内建函数..转载 2022-01-12 08:40:21 · 193 阅读 · 0 评论 -
Golang 类型byte和rune是什么?
要讨论byte和rune,自然就离不开unicode字符集,那么什么是unicode字符集呢?我们知道计算机存储的都是二进制,如果一个字符要存储到计算机中,那么会事先通过一个映射关系表,也就是我们所说的unicode字符集,找到这个字符对应的16进制表示。unicode字符集收录了世界上所有的字符,不管汉字或者英文、数字、符号等,里面都可以找到一个对应的16进制的表示。例如:“你好,wei”,在unicode字符集中对应的16进制是这样表示的你 4f60好 597d, ff0c转载 2022-02-09 13:54:19 · 211 阅读 · 0 评论 -
Golang语言如何高效拼接字符串?
最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现,下面这篇文章主要给大家介绍了关于Golang语言如何高效拼接字符串的相关资料,需要的朋友可以参考下目录01、介绍 02、操作符 + 03、strings.Join 方法 04、fmt.Sprint 方法 05、bytes.Buffer 类型 06、strings.Builder 类型 07、总结01、介绍在编程语言中,字符串是一种重要的数据转载 2022-02-09 11:24:28 · 859 阅读 · 0 评论 -
Golang channel了解吗,channel的工作原理是什么?
Go不推荐用共享内存方式来通信,推荐使用通信的方式来共享内存。channel用于多个goroutine之间传递数据,且保证整个过程的并发安全性。channel是Go特有一种数据结构,可以理解为一个管道。管道分为无缓存的管道和有缓存的管道。Go语言内存模型规范,对于从无缓冲Channel进行的接收,发生在对该Channel进行的发送完成之前。也就是说,无缓存管道,发送和接收是同步的,任意一个操作都无法离开另一个操作单独存在。否则就会发生deadlock死锁。package mainim转载 2022-01-05 15:48:29 · 269 阅读 · 0 评论