Go
文章平均质量分 75
Hi丶ImViper
这个作者很懒,什么都没留下…
展开
-
Go 中 Gzip 与 json 搭配使用压缩数据,减少数据传输量
Go 中 Gzip 与 json 搭配使用压缩数据前言在日常工作中,如果遇到数据量大的情况,在 db 中是不能直接存储某些字段的,一般会用 json 进行marshal 为 byte 再存入。但是如果此时占用空间依旧过大,则可以考虑再用 gzip 还进一步压缩。Gzip 包go标准库的gzip包中提供了两个操作,分别是压缩和解压常量和变量 const ( NoCompression = flate.NoCompression // 不压缩 BestSpeed原创 2022-03-19 09:27:22 · 7450 阅读 · 0 评论 -
Go语言核心:Go的基本结构
Go 程序的基本结构和要素示例 4.1 hello_world.gopackage mainimport "fmt"func main() { fmt.Println("hello, world")}1 包的概念、导入与可见性包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。如同其它一些编程语言中的类库或命名空间的概念,每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包原创 2021-12-07 22:25:32 · 793 阅读 · 0 评论 -
Go基础系列:Go安装与环境配置
1 平台与架构Go 语言开发团队开发了适用于以下操作系统的编译器:LinuxFreeBSDMac OS X(也称为 Darwin)目前有2个版本的编译器:Go 原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix 系统下工作 。其中,gc 版本的编译器已经被移植到 Windows 平台上,并集成在主要发行版中,你也可以通过安装 MinGW 从而在 Windows 平台下使用 gcc 编译器。这两个编译器都是以单通道的形式工作。你可以获取以下平台上的 Go 1.4 源码原创 2021-12-06 23:00:19 · 1544 阅读 · 0 评论 -
Go语言面试系列:Go基础类型大全
Go语言面试系列:Go基础类型大全go语言自带的基础类型包括int :有符号的整数类型,具体占几个字节要看操作系统的分配,不过至少分配给32位。uint:非负整数类型,具体占几个字节要看操作系统的分配,不过至少分配给32位。int8:有符号的整数类型,占8位bit,1个字节。范围从负的2的8次方到正的2的8次方减1。int16:有符号的整数类型,占16位bit,2个字节。范围从负的2的16次方到正的2的16次方减1。int32:有符号的整数类型,占32位bit,4个字节。范围从负的2的32次方原创 2021-09-29 21:26:41 · 986 阅读 · 0 评论 -
一文搞得Go mod!超详细使用教程,管理好你的go包!
go语言包管理工具 go mod 详细介绍通常来说我们创建某个项目都是直接使用IDE来进行创建,当然了使用vs code这种文本编辑器也可以,所以说使用这些工具来创建一个go的开发环境,是几乎不需要设置的,因为ide已经帮你设置好了,我们就拿goland来说,当我们选择新建一个go项目的时候,go.mod和go.sum都会自动创建完成,说到这里我们就要提一下这两个文件了。go.mod :通常你会见到这样的格式module github.com/shgopher/shortgo 1.16req原创 2021-09-29 21:23:05 · 3179 阅读 · 0 评论 -
Go面试系列:Goroutine为什么设计为没有ID?
GoroutineID 是什么我们要知道,为什么大家会下意识的想去要 GoroutineID,下面引用 Go 语言圣经中的表述:在大多数支持多线程的操作系统和程序语言中,当前的线程都有一个独特的身份(ID),并且这个身份信息可以以一个普通值的形式被很容易地获取到,典型的可以是一个 integer 或者指针值。这种情况下我们做一个抽象化的 thread-local storage(线程本地存储,多线程编程中不希望其它线程访问的内容)就很容易,只需要以线程的 ID 作为 key 的一个 map 就可以解原创 2021-08-24 22:17:51 · 518 阅读 · 0 评论 -
Go 面试系列:如何比较GO中的结构体?
结构体是什么在 Go 语言中有个基本类型,开发者们称之为结构体(struct)。是 Go 语言中非常常用的,基本定义:type struct_variable_type struct { member definition member definition ... member definition}简单示例:package mainimport "fmt"type Vertex struct { Name1 string Name2 s原创 2021-08-24 22:14:56 · 3003 阅读 · 0 评论 -
Go语言里如何采用面向对象编程?Go中一样能够面向对象!
Go 里也有面向对象Go语言虽然没有class,不过Go也是可以实现Object Oriented的。接下来让我们尝试在Go中使用面向对象,看看能否找到最佳实践。使用 embed type 实现继承Go 中的嵌入类型 embed type 本质上是一种 composition,Go 不像其它 OO 语言那样提供基于类的继承,那些继承体现的是 is-a 关系,但是 Go 不是。Go 通过 embed type,可以实现 method 和 field 的复用。package mainimport原创 2021-08-13 19:42:25 · 387 阅读 · 0 评论 -
大厂面试必会语言:GO语言入门,看这一篇就够了
前言最近大厂的面试岗位,越来越多要求要会go语言,那么go要怎么学呢?其实go的入门不难,下面给大家推荐一些go的教程。官方教程Language Specificationgo 的语法说明以及语言的组织结构,包含大量的细节解释和说明,值得通读一遍A Tour of Gogo 官方在线的教程,可执行代码,对 go 语言的执行和抒写有直观的演示,首次学习 go 的练习之地Go wiki包含大量第三方的文章和书籍来对某个特定主题的原理进行深入的解释和演示Blog对某些特定主题进行说明和演示,原创 2021-07-30 21:40:35 · 597 阅读 · 0 评论 -
Go中的nil是是什么?和java的null有区别吗?
Go面试基础:Go中的nil是是什么?和java的null有区别吗?前言go语言中,有一个和java里的null很相似的变量为nil,但它其实还是有很多特性的,下面让我们一起来看看这里面有什么区别吧!1. nil 是不能比较的code-1package mainimport ( "fmt")func main() { fmt.Println(nil==nil)}code-1 输出tmp/sandbox318449491/main.go:8: invalid ope原创 2021-07-30 21:26:51 · 1190 阅读 · 0 评论 -
Go中优雅的获取Map元素的多种方法
Go语言获取map元素教程Go 语言 中要获取 map 中的元素,除了使用 遍历 的方式,我们还可以使用 key 做为索引的形式来获取 map 指定 key 的元素。根据 map 的 key 获取 map 的元素,返回两个返回值,第一个返回值是获取的值,如果 key 不存在,返回空值,第二个参数是一个 bool 值,表示获取值是否获取成功。如果我们只使用一个值,接受 map 的返回值,那么返回的 map 的 key 对应的 value,如果我们需要判断一个 map 中的 key 是否存在,那么我们可以原创 2021-07-30 21:25:46 · 12669 阅读 · 0 评论 -
缓存击穿了怎么办?使用singleflight轻松解决!
singleflight使用场景缓存击穿:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。绝大多数公司都是这么用的请求资源去重复我们的用法,需要改动一行代码。singleflight 简介singleflight 在 golang.org/x/sync/singleflight 项目下,对外提供了以下几个方法//Do方法,传入key,以及回调函原创 2021-07-21 10:06:59 · 507 阅读 · 2 评论 -
Go msgp序列化使用详解!比Json更快!面试时吊打面试官!
msgp简介msgp是MessagePack的缩写,是一种高效的二进制序列化格式,用它官网的一句简单的介绍就是:“It’s like JSON.but fast and small.”,JSON大家都知道吧,基本JSON能做的事,msgp都能做,而且比JSON更快,更小。 官网在这,大家想详细了解的直接移步到官网去围观吧。msgp应用在golang既然msgp这么好,那支持的语言肯定很多吧,没错,到目前为止,msgp对大部分主流的语言都已经支持得很好了,包括golang,官方推荐的库在git上的地址h原创 2021-07-09 09:39:03 · 1622 阅读 · 0 评论 -
Go语言实现枚举方法,const和iota结合轻松实现
Go语言现阶段没有枚举类型,但是可以使用 const 常量配合 iota 来模拟枚举类型,请看下面的代码:type Weapon intconst ( Arrow Weapon = iota // 开始生成枚举值, 默认为0 Shuriken SniperRifle Rifle Blower)// 输出所有枚举值fmt.Println(Arrow, Shuriken, SniperRifle, Rifle, Blower)// 使用枚原创 2021-07-05 21:55:16 · 921 阅读 · 0 评论 -
Go中如何比较两个json?深度优先搜索解决,超详细代码!
假设,现在有两个简单的json文件。{ "id":1, "name":"testjson01", "isadmin":true}{ "isadmin":true, "name":"testjson01", "id":1 }那么,如何比较这两个json的内容是否相同呢?首先,最基本的方法就是利用golang的反射提供的DeepEqual()假设我们有一个读取json文件的函数如下:func LoadJson(path string, di原创 2021-07-04 21:03:20 · 4647 阅读 · 4 评论 -
Go 中的 JSON如何序列化和反序列化?来看看go的包怎么实现!
理解 Go 中的 JSONJSON 是一种轻量级的数据交换格式,常用作前后端数据交换,Go 在 encoding/json 包中提供了对 JSON 的支持。序列化把 Go struct 序列化成 JSON 对象,Go 提供了 Marshal 方法,正如其含义所示表示编排序列化,函数签名如下:func Marshal(v interface{}) ([]byte, error)举例来说,比如下面的 Go struct:type Message struct { Name string原创 2021-07-02 09:47:45 · 2046 阅读 · 0 评论 -
Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?
Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?前言现在的大厂都开始慢慢使用Go语言了,例如字节已经把Go作为后端开发的主要编程语言。但是Go的面试题总结的比较少,于是打算开启这个专栏,一起学习一起进步。前几天被问到一个问题:“单机的 goroutine 数量控制在多少比较合适?”。第一反应一样是答复 “控制多少,我觉得没有定论”。紧接着延伸出了更进一步的疑惑:“goroutine 太多了会影响 gc 和调度吧,主要是怎么预算这个数是合理的呢?”这是本文要进行原创 2021-06-15 22:34:35 · 2896 阅读 · 5 评论 -
Go 面试系列: new 和 make有什么不同之处呢?
Go 面试系列: new 和 make有什么不同之处呢?前言现在的大厂都开始慢慢使用Go语言了,例如字节已经把Go作为后端开发的主要编程语言。但是Go的面试题总结的比较少,于是打算开启这个专栏,一起学习一起进步。在 Go 语言中,有两个比较雷同的内置函数,分别是 new 和 make 方法,其主要用途都是用于分配相应类型的内存空间。看上去 new 和 make 都是分配内存的,那他们有什么区别呢?这个细节点也成为了不少 Go 语言工程师的面试题之一,值得大家一看。在这篇文章中我们将来解答这个问题。原创 2021-06-15 22:33:54 · 251 阅读 · 0 评论 -
Go 面试系列:Go interface中nil的比较问题
Go 面试系列:Go interface中nil的比较问题前言现在的大厂都开始慢慢使用Go语言了,例如字节已经把Go作为后端开发的主要编程语言。但是Go的面试题总结的比较少,于是打算开启这个专栏,一起学习一起进步。最近在网上看到有小伙伴在 Go 面试的时候被问到了:来自网上博客的截图今天特意分享出来让大家避开这个坑。例子一第一个例子,如下代码:func main() { var v interface{} v = (*int)(nil) fmt.Println(v原创 2021-06-15 22:33:02 · 398 阅读 · 0 评论 -
Go语言fmt.Sprintf(格式化输出)
Go语言fmt.Sprintf(格式化输出)格式化在逻辑中非常常用。使用格式化函数,要注意写法:fmt.Sprintf(格式化样式, 参数列表…)格式化样式:字符串形式,格式化动词以%开头。参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。在 Go 语言中,格式化的命名延续C语言风格:var progress = 2var target = 8// 两参数格式化title := fmt.Sprintf("已采集%d个药草, 还需要%d个完成任务",原创 2021-04-30 19:56:43 · 7874 阅读 · 3 评论