
go
文章平均质量分 74
猴蹲蹲
码农界的社会人。
展开
-
golang面试题(3):切片使用陷阱
golang中slice切片面试题原创 2022-04-20 15:09:19 · 515 阅读 · 0 评论 -
golang 操作mongo上亿级别数据的插入优化方案
golang 操作mongo上亿级别数据的插入优化方案背景mongo集群中已经存在十五亿数据,需要将一批将近8亿条数据(有重复)继续导入进数据库中。此数据存储在了sqllite 中。要求:1:如果数据已经存在,需要更新操作;如果没有数据,则执行新增操作。可以利用mongodb的 upsert操作来处理。2:时间尽量压缩方案一读取数据,将每条数据进行upsert操作。此方案可以满足要求1,但是不满足要求2。 处理时间预计在30-40天左右方案二批量处理,使用collection.Bul原创 2022-03-21 12:37:35 · 2885 阅读 · 0 评论 -
golang并发控制之channel
并发控制之channel我们考虑一种场景,协程A在执行过程中需要创建子协程A1、A2、A3…An,协程A创建完子协程后就等待子协程退出。针对这种场景,Go提供了三种解决方案。Channel:使用channel控制子协程WaitGroup:使用信号量机制控制子协程Context:使用上下文控制子协程三种方案各有优劣,比如Channel的优点是实现简单,清晰易懂,WaitGroup的优点是子协程的个数可以动态调整,Context的优点是对子协程派生出来的孙子协程的控制。各种解决方案的缺点是相对而言原创 2021-09-07 10:17:24 · 784 阅读 · 1 评论 -
golang面试题(2):for-range特性
下面这段代码输出的内容package mainfunc main() { slice := []int{0,1,2,3} m := make(map[int]*int) for key,val := range slice { m[key] = &val } for k,v := range m { fmt.Println(k,"->",*v) }}答案: 3 2 1 p原创 2021-09-07 09:41:08 · 159 阅读 · 0 评论 -
golang面试题(1):defer的执行顺序
下面这段代码输出的内容package mainimport ( "fmt") func defer_function() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }() defer func() { fmt.Println("3") }() panic("exception")}func main() { defer_function()}原创 2021-09-06 10:54:59 · 962 阅读 · 0 评论 -
golang协程goroutine
协程goroutine概念协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。根据维基百科的记录,协程术语coroutine最早出现在1963年发表的论文中,论文作者是美国计算机科学家马尔文·爱德华·康威。协程并不是Go发明的概念,支持协程的编程语言有很多,比如python、pe原创 2021-08-30 15:08:33 · 1737 阅读 · 1 评论 -
golang控制结构之select
selectselect是Go在语言层面提供的多路I/O复用机制,用于检测多个管道是否就绪( 即可读或可写 ),其特性和管道息息相关。特性速览管道读写select只能作用于管道,包括数据的读取和写入,如下面代码所示:func SelectForChan(c chan string) { var recv string send := "Hello" select { case recv = <-c: fmt.Printf("recvied %s \n", recv) case原创 2021-08-28 12:48:42 · 3154 阅读 · 0 评论 -
golang数据结构初探之字符串string
字符串stringstring 是Go语言中的基础数据类型。特性速览声明声明string变量非常简单,常见的方式有以下两种:声明一个空字符串后再赋值var s string s = "hello world"需要注意的是空字符只是长度为0,但不是nil。不存在值为nil的string使用简短变量声明:s := "hello world" //直接初始化字符串双引号与单引号字符串不仅可以使用双引号赋值,也可以使用反单引号赋值,它们的区别是在于对特殊字符的处理。假如我们希望stri原创 2021-08-23 15:40:05 · 6849 阅读 · 0 评论 -
golang数据结构初探之iota
iotaGo语言的iota常用于const表达式中,其值是从0开始的,const声明块中每增加一行,iota值都会自增1。使用iota可以简化常量的定义,但其规则必须牢记,否则在阅读源码时可能会造成误解或者障碍。本章我们尝试从编译器的角度来理解iota,从而加深认识。特性速览在常量声明语句中,iota经常用于声明连续的整型常量。iota的取值与其出现的位置强相关。iota在const关键字出现时被重置为0const声明块中每新增一行,iota的值自增1这种描述本身没有错误,在简单的语句中套原创 2021-08-20 18:16:33 · 7497 阅读 · 0 评论 -
golang数据结构初探之结构体struct
结构体structGo语言的struct与其他编程语言的class有些类似,可以定义字段和方法,但是不可以继承内嵌字段Go语言的结构体没有继承的概念,当需要"复用"其他结构体时,需要使用组合的方式将其他结构体嵌入进来。如下所示:type Animal struct { Name string}func (a *Animal) SetName(name string) { a.Name = name}type Cat struct { Animal //隐式声明}func m原创 2021-08-20 15:52:26 · 6236 阅读 · 0 评论 -
golang数据结构初探之字典map
MapGo语言的map底层使用Hash表实现的特性预览操作方式初始化map分别支持字面量初始化和内置函数make()初始化字面量初始化func MapInit() { m := map[string]int{ "apple": 1, "banana": 2, } for k, v := range m { fmt.Printf(" %s : %d \n", k, v) }}内置函数make()func MapInit() { m := make(map[st原创 2021-08-19 17:14:25 · 5705 阅读 · 0 评论 -
golang数据结构初探之动态数组slice
动态数组sliceslice 又称动态数组,依托于数组实现,可以方便的进行扩容和传递,实际使用时比数组更灵活。但正是因为灵活,实际使用时更容易出错,避免出错的最好方法便是了解其实现原理。特性速览初始化声明和初始化切片的方式主要有以下几种方式:变量声明字面量使用内置函数make()从切片和数组中切取变量声明这种声明方式的切片变量与声明其他类型变量一样,变量值都为零值,对于切片来讲零值为nilvar s []int字面量也可以使用字面量初始化切片,需要了解的是空切片是指长度为空,原创 2021-08-17 18:31:33 · 19232 阅读 · 0 评论 -
golang数据结构初探之管道chan
golang数据结构初探之管道chan管道是go在语言层面提供的协程之间的通信方式,比unix的管道更易用也更轻便。特效速览初始化声明和初始化管道的方式主要有以下两种:变量声明使用内置函数变量声明这种方式声明的管道,值为nil。每个管道只能存储一种类型的数据var ch chan int //声明管道使用内置函数 make()使用内置函数make() 可以创建无缓冲管道和带缓冲管道ch1:=make(chan string) //无缓冲管道ch2:=make(chan s原创 2021-08-16 12:45:09 · 18873 阅读 · 0 评论 -
基于gitlab+docker+k8s打造自动化构建部署流程
工程自动化构建部署前言 随着需求越来越多,以及相关代码分支权限的流程规范化,团队内部的项目上线部署复杂度提升,基于现有的环境和市场上主流的软件,打造了一套基于gitlab+docker+harbor+kubernetes的自动化构建部署流程(CI/CD),目前团队内部流程基本走通,整理了一份相关文档分享出来。写的糙的地方,轻喷。概念GitLab CI/CD GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。与之对应的有GitHub和原创 2021-08-06 18:45:39 · 36411 阅读 · 8 评论 -
golang中内存泄露的发现与排查
项目场景:golang中内存泄露的发现与排查一直是来是go开发者头疼的一件事,恰巧最近负责的风控项目,内存使用暴涨,发生了内存直接打满而挂掉的情况。刚开始以为是随着业务的增长,数据处理不过来导致的。但是经过业务的分析和对比,发现并不是如此。幸好go语言有性能大杀器可以监控到,最终根据pprof,问题定位到为go协程泄漏问题。解决完问题后进行记录和分享,写的不对之处,请大家多多指出。问题描述:运维同学发出告警提示,服务器的内存即将打满,看看服务是否异常。收到这个消息后,赶紧看服务器的资源使用情况原创 2021-04-29 14:37:55 · 17685 阅读 · 6 评论 -
golang 数组随机排序
golang 数组随机排序文章目录golang 数组随机排序前言具体实现步骤如下1.引入库2.读入数据总结前言目前接到一个推荐数据的需求,需要将数据库中获取到的数据进行随机排序后返回给用户。考虑了一下,有两种使用方式,一种是通过数据库 order by rand() ,还有一种就是本文需要使用到的代码处理具体实现步骤如下1.引入库代码如下:import ( "fmt" "math/rand" "time")2.读入数据代码如下:type CategoryEntity str原创 2021-04-23 19:02:15 · 16128 阅读 · 0 评论 -
基于Go语言实现的简易api网关
基于Go语言实现的简易api网关 (新手轻喷)api网关核心功能是实现http转发和重新功能,http代理的结构和思路很简单,通过浏览器发送请求,proxy拿到浏览器的请求去请求目标地址,然后获得结果它再发送给浏览器。对于Go语言来说,实现转发只需要简单的一行代码即可实现,如下所示:httputil.NewSingleHostReverseProxy(address)基于此功能,进行简单包装,实现从远端admin管理中心获取需要转发的路由信息或者可以从本地配置文件中获取,实现动态转发。后续可以根据业原创 2020-12-05 12:55:41 · 19812 阅读 · 2 评论