对于go的net/http包,主要分为两个部分,一部分是针对客户端的,一部分是针对服务端的,本篇文章主要介绍服务端这部分内容。一、总体介绍一个http消息的流程如下所示,其中红框部分是server部分的内容,主要包括两部分内容:ServerMux 和 Handler。ServerMux 本质上是一个 HTTP 请求路由器(也叫多路复用器Multiplexor)。它把收到的请求与一组预先定义的 URL 路径列表做对比,然后在匹配到路径的时候调用关联的处理器(Handler)。处理器(Handle...
-
Go之Http包的服务端介绍
-
Go之断言类型(assert type)
1.背景介绍: 笔者最近在使用一个数据结构实现多个接口,但是却发现想要在一段时间内转换成接口1,另外一段时间转换成接口2,所以也就使用到了断言类型。在看过断言类型之后,觉得还是很有必要讲一讲这个断言类型,于是便有了这篇文章。2. 断言类型介绍:接口类型提供一种,将接口类型转换成具体类型的转换方法,也就是断言类型(assert type)。使用方法如下所示:1)语法一t := i.(T)解释说明:T:表示的是具体的数据类型,i:表示的是接口变量i,t:表示的是转换之后的变量。功能介绍:这个语句实现...
-
Go语言==真的那么简单吗
1.背景介绍:笔者最近发现对于Go的struct在使用==的时候,有时候可以使用,有时候却不能使用,甚至编译出错。基于这个既定事实,笔者做了一次实现,便整理了这篇文章出来。struct使用==的例子如下所示:场景1:==可以使用package main import ( "fmt") type node struct { Name string Age int} func main() { n1 := node{Name: "hello", Age: 10} n2 := nod...
-
Go之sort
一、sort介绍: Go的pkg提供了一个排序的包sort,用于对slices和用户自定义的类型进行排序操作。原文参考:Package sort provides primitives for sorting slices and user-defined collections.https://golang.org/pkg/sort 该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序,但是这四种排序方法是不公开的,它们只被用于 sort 包内部使用。 我们在对数...
-
go之sync.Map
背景介绍:在golang中map不是并发安全的,所有才有了sync.Map的实现,尽管sync.Map的引入确实从性能上面解决了map的并发安全问题,不过sync.Map却没有实现len()函数,这导致了在使用sync.Map的时候,一旦需要计算长度,就比较麻烦,一定要在Range函数中去计算长度(备注:这个后面会有例子给出)。基于上面的现状,笔者从下面几点开始整理了这些知识:普通map的介绍,包括线程不安全部分和常规使用方法。sync.Map的使用方式。sync.Map的底层实现介绍。一、ma...
-
Go并发之atomic
原文链接: https://mp.weixin.qq.com/s/RvFWCMX8P3VxjJrZRJZzMQ1. atomic介绍: sync/atomic包提供了原子操作的能力,直接有底层CPU硬件支持,因而一般要比基于操作系统API的锁方式效率高些;这些功能需要非常小心才能正确使用。 除特殊的底层应用程序外,同步更适合使用channel或sync包的功能。 通过消息共享内存; 不要通过共享内存进行通信。英文介绍如下:(Package atomic provides low-...
-
Go之定时器的使用
一、背景介绍笔者最近在使用Go的定时器,发现Go提供的time包里面,按照下面几种场景做了区分,并分别提供一些API支持。主要场景如下所示:1.超时一次之后,就不再使用的定时器,time.After()。2.每隔一段时间,就需要使用一次的定时器,time.Tick()。3.阻塞住goroutinue的定时器,time.Sleep(),准确来说这个不算一个定时器4.可以自由控制定时器启动和关闭的定时器,time.Ticker()。二、实例演练1. time.After()调用time.After(...
-
Go学习笔记目录
(基础知识篇)一、Go语言之语言结构二、Go语言之变量三、Go语言之常量四、Go语言之指针五、Go语言之延迟调用函数defer六、Go语言之匿名函数和C++的lambda表达式七、Go语言之类篇八、Go 语言之循环语句九、Go语言之Switch十、Go语言之continue/break label十一、Go语言之Map非并发安全十二、Go语言之Json的struct tag十三、Go 语言之restful 基础十四、Go并发之一:go语句篇十五、Go并发之二:goroutine的调度原理十六、G...
-
Go mod的简单实践
Go mod简介: Go mod是官方推荐的包管理方式,开始于go1.11,在go1.12版本基本稳定,go1.13之后开始默认开启。 本文主要从工程使用方面来介绍Go mod,包括如何简单的使用Go mod,Go mod的命令介绍,go.mod和go.sum的内容介绍,算是一篇Go mod的基础实践。一、Go mod实例介绍1. 产生go.mod文件创建目录,使用go mod init $ go mod init example.com/hello // 这里的模块名称指定为exa...
-
Go slice和arry的区别
最近踩了一个go的坑,而这个坑的根本原因就是slice和arry的区别理解不清楚导致的。 一、问题提出,slice在被复制之后,修改复制之后的那个slice内容,结果复制之前的slice内容也变化了。 我们先来看一段代码: package main import ( "fmt" "reflect" ) func main() { var arr [8]int = [8]int{1} var arr1 [8]int var sl...
-
Go语言之GRPC
1.RPC的基本知识介绍:RPC叫做远程调用框架(Remote Procedure Call),远程调用原理如下所示:比如 A (client) 调用 B (server) 提供的remoteAdd方法: 首先,A与B之间建立一个TCP连接; 然后,A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去; 接着,B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回; 最...
-
Go语言之性能分析工具pprof
一、pprof的概述:pprof:是Go的性能分析工具,在程序运行过程中,可以记录程序的运行信息,可以是CPU使用情况、内存使用情况、goroutine运行情况等,Go语言已经将pprof 封装在包net/http/pprof中。对于pprof来说主要用于:CPU分析、内存分析、阻塞分析、互斥锁分析。查看这些指标有两种方式,一种是浏览器方式,一种是命令行方式。浏览器方式:通过 http://pprofIPAddress:port/debug/pprof/ 来访问,访问之后的界面如下所示:命令行方...
-
Go垃圾回收之三色标记算法
转自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/SFJoSSbvv3KyYKz4osUnFw三色标记法介绍:三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的算法,但是也会有一个缺陷,可能程序中的垃圾产生的速度会大于垃圾收集的速度,这样会导致程序中的垃圾越来越多无法被收集掉。原理如下所示:step 1: 创建:白、灰、黑 三...
-
Go内存管理之TCMalloc
转自公众号:灰子学技术,原文链接:https://mp.weixin.qq.com/s/-b26YiHjL3V9CNvk0LZmEgTCMalloc作为Go语言内存管理的核心算法,是理解和掌握Go的内存管理非常重要的一步,本章主要介绍TCMalloc的是什么样子的。TCMalloc的概述TCMalloc全称是Thread-Caching Malloc,是Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:...
-
Go语言之逃逸
转自微信公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/8o8MsExj5BLje38TZoZG5g本篇做为Go语言内存管理的第一篇文章,会从下面几个方向来讲述:1.什么是逃逸?2.为什么需要逃逸?3.逃逸是怎么实现的?一、什么是逃逸在开始讲逃逸之前,我们先看一下,下面的两个例子。例子1:stack.go的fun()返回的就是一个int变量。例子2:mem.go的fun()返回的是*int变量,同时里面的返回值是&i。源代码如下所示:$ go tool c...
-
Go语言之rune
转自公众号:“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/Q5RPN0NUmAQzs3o2Tw7HXg本章算是Go语言中的一个小知识点,很简单,了解就好。1. rune类型rune类型是Go语言中的一个基本类型,其实就是一个uint32的别名,主要用于表示一个字符类型大于一个字节小于等于4个字节的情况下,特别是中文字符,定义如下所示:rune is an alias for int32 and is equivalent to int32 in all ways...
-
Go语言之init函数
转自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/vfUPNY-bW3zo-xWf0q6HCQGo语言有一个特殊的函数init,先于main函数执行,实现包级别的一些初始化操作。对于init 函数来说:每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会安排在 main 函数之前执行。init 函数用在设置包、初始化变量或其他要在程序运行前优先完成的引导工作。init函数的主要作用:1)初始化不能...
-
Go语言之unsafe
文章转自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/p4ik3GsM3uGb6yvgVVxMdQ很多同学可能很奇怪,Go不是有指针类型了吗?为啥还需要这样一个unsafe的包呢,关键这个包的名字还是这么的让人不放心,叫做不安全包?而这个包又能够做什么呢,可以帮助我们解决那些问题呢?笔者在学习Go的时候,也被这些问题困扰着,于是便自己整理了这篇文章来讲解下,希望对大家有所帮助。1.指针类型介绍:对于Go语言的指针类型来说,指针类型的限制比较多,主要有四点,并且在...
-
Go语言之Cond
转自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/9FjBJVhRBVSBV4CVpCfChgGolang的sync包中的Cond实现了一种条件变量,主要用来解决多个读协程等待共享资源变成ready的场景。在使用Cond的时候,需要特别注意下:每个Cond都会关联一个Lock(*sync.Mutex or *sync.RWMutex),当修改条件或者调用Wait方法时,必须加锁,保护condition。1. Cond的介绍:定义如下所示:Cond相关API...
-
Go语言之Once
转自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/DRjuGDwE04f0Yy9QvpYufAsync.Once是sync包中的一个对象,它只有一个方法Do,这个方法很特殊,在程序运行过程中,无论被多少次调用,只会执行一次。1.适用场景:在一个进程之中,如果一个函数里面的一部分代码,希望在很多协程都执行的时候,只被执行一次,那么Once便起到了作用。例如:初始化进程中的共享内存,它只希望被该进程初始化一次,其他协程不需要初始化操作。例子:结果分析:从上面...
-
Go语言之RWMutex
转自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/0nfjNsFNIrMhYJMf3P-sEw本篇文章,笔者主要来介绍读写锁的一种Go语言的实现方式RWMutex。1.基本概念读写锁:是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。读操作可并发重入,写操作是互斥的。主要适用的场景是:读多写少的业务场景。这种场景下如果每次读写都使用互斥锁那么整个效率就会变得很低。因为只是读的话并不需要互斥锁来锁住数据,只有写操作的时候需要互斥锁,而读...
-
Go语言之mutex
转自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/XBCcgQsk7WRE9rC2xn6ZiA 写在前面的话:程序中的并发,是导致临界区竞争的根本原因,而解决这个问题的最常用办法就是锁机制,而mutex是Go语言之中最基本的一种锁机制。这篇文章,笔者主要来介绍下Go语言的这个锁机制mutex,在开始之前,我们需要先介绍下几个概念。1. 基本概念临界区(Critical Section): 当程序并发地运行时,多个Go协程不应该同时访问那些修改共享资源的代码...
-
Go语言之panic和recover
转自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/cfPY26_zOzFFSuPbElDU-Q写在前面的话:panic是Go语言中,用于终止程序的一种函数,往往用在下面两种情况:1)程序出现了很大的故障,例如不能在提供服务了。2)程序在运行阶段碰到了内存异常的操作,例如空指针的取值,改写只读内存等。对于panic来说,1)场景往往是主动调用; 2)场景则是被动调用,panic一旦产生之后,会将堆栈里面的数据dump出来,这样就方便了开发人员来定位问题。recov...
-
Go语言之error
本文转自“灰子学技术”, 原文链接:https://mp.weixin.qq.com/s/yxlfeFmfupv87Fgh7rL6_w 写在前面的话:Go语言提供了一个error类型,专门用来表示程序出现异常的错误信息。但是有时候,error本身提供的这些错误信息不能完全满足我们的要求,这种情况下我们就需要自己去改造error,来实现自己希望的error格式以及内容。下面笔者主要来讲下这件事情,不过在讲这之前,我们先看下error的定义吧。1. error介绍error其实就是实...
-
Go语言之装饰器
转自本人公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/33VmMYOCQjptIyALABXfuQGo的装饰器本质上允许您包装现有功能,并添加你自己的自定义功能,它操作的对象是函数,返回的对象也是函数。1.简单的一个装饰器例子:结果分析:从输出的结果能够看出,调用了装饰器之后,函数testFunc已经实现了,“自己的代码 + 原来代码”的效果。2.如果我们希望装饰器装饰的函数类型不是固定的呢,也就是说我们希望装饰器装饰的函数可以是任何函数,这样我们该怎么办?...
-
Go语言之反射
来自本人公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/SBqx0theCm-GWzV6CPIAYA笔者原本是C++开发人员,之前对于反射没太大概念,学了GO之后,才开始接触,在研究了一段时间之后,有了些认识,便整理一个帖子,希望对大家有所帮助。在学习反射的时候,笔者一直在问自己,反射是什么?为什么要用到反射?它是怎么实现的?笔者觉得,在知道这些问题的答案之后,才算是真正了解反射。下面笔者便从这些问题来着手整理反射。一、反射是什么?维基百科上的定义:在计算机科学...
-
Go语言之条件编译
原文转自本人公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/iaxXuFKGDt7MCkd8EDWpFg背景介绍:我们在开发的过程中,特别是在重构的过程中,往往会存在新代码和老代码同时都在的情况。这种情况下,我们希望可以编译不同的版本,旧代码编译的版本用来做产品发布,没有改好的新代码用来做测试,等测试通过之后,再把旧代码移除。在C和C++中,我们可以很轻松的完成这件事情,那就是使用“预编译宏”#ifndef XXX #define XXXX #endif,...
-
Go语言之指针常见问题
原文来自于本人公众号,“灰子学技术”。原文链接:https://mp.weixin.qq.com/s/1n_s5EDm5Sl75J4GKVWKOQ在Go语言中,指针其实有下面几种表现形式,第一:指针;第二:接口;第三:slice;第四:map。场景一:指针变量作为参数使用,会被复制一份指针变量对于指针来说,最常见也最容易让人产生混淆的便是,指针作为参数传递的时候,到底是复制了一份指针变量,还是类似于C++的引用一样,使用的是传入之前的指针变量?例子:Output:介绍:通过上面的例子输出结果...
-
Go接口之nil != nil
本文来自“灰子学技术”,原文链接如下所示:https://mp.weixin.qq.com/s/ZBd1UcIJFk_DonkxVNgERA一、引出话题:在开始这个话题之前,我们先看一段代码以及其输出结果,代码如下所示:Output: 从上面的输出结果来看,GetA()返回的类型为*A就算赋值为nil,也不等于nil。看到这里笔者觉得很奇怪,明明是GetA()返回值是nil,为什么nil的判断条件是false呢?二、原因分析:在研究了interface之后,笔者发现了真相,原来Go语言中的i...
-
Go语言之可变参数函数
原文转自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/1ZLeWvORqR-MKBgn5hAvnAGo中的函数支持可变参数,这一特性其实只是Go语言的一种语法糖,格式如下所:func function(values...Type) {} // Type:表示的是具体的参数归属类型,可以是int,string...甚至interface例子1: 可变参数是同一种类型的通过上面的代码可以看出,可变参数的函数,对4种参数的输入方式都支持,它们分别是:1.不输入参...
-
Go之一步步学习RabbitMQ(二)
原文来自:灰子学技术,原文链接:https://mp.weixin.qq.com/s/AWlfFB8TUKw5vMsAgrmRKA写在前面的话:本篇文章主要来讲解,RabbitMQ的路由知识,在开始之前,笔者问了自己几个问题。笔者觉得一旦知道了这几个问题的答案,那么关于RabbitMQ的路由这部分知识基本上算事熟悉了,所以还希望大家带着这些问题来阅读本篇文章。1. 为什么RabbitMQ需要路由呢?它们有什么用?2.路由都有那些分类?各自有什么特点?3.这些路由是如何实现消息转发的?一、Rabb...
-
Go之一步步学习RabbitMQ(一)
本文来自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/YDtJzDYn7EMeoupRFwrulg写在前面的话:最近笔者在学习RabbitMQ,便尝试着通过下面的学习过程,来尽量还原RabbitMQ为什么如此设计,以及它是如何解决这些问题的。当中如有不对或者理解偏差的地方,还请大家不吝赐教,多多留言。如果你觉得这篇文章真的帮到了你,还请你顺手转发下。背景知识:在学习RabbitMQ之前,我们需要对下面的知识有些概念,生产者(producer):产生并发送消...
-
Go语言之命令行参数支持
本文转自同步公众号:灰子学技术 (备注:文章会首发在公众号,如果大家觉得有帮助,就顺手转发下吧。)原文链接:https://mp.weixin.qq.com/s/gK-Ubn9WyvFQKhqcf20Kcg本篇文章只用来讲解如何实现,一个带命令行的程序。对于这个功能的实现方法,有两种,一种是通过os包的os.Args来实现;另外一种通过flag包来实现。方法一:os.Args实现下面我们来写一个main函数,里面os.Args是一个[]string类型,在运行main函数的时候,命令行种的参数会...
-
Go语言之性能测试相关(基准测试)
来自公众号:灰子学技术 原文链接:https://mp.weixin.qq.com/s/CmiPafXfvzJjM6UxaFCaCQ在Go语言中,提供了测试函数性能(CPU和Memory)的测试方法,基准测试。基准测试主要用来测试CPU和内存的效率问题,来评估被测代码的性能。测试人员可以根据这些性能指标的反馈,来优化我们的代码,进而提高性能问题。本篇文章主要来介绍,基准测试的使用方法和性能指标的分析。1. 使用规则如下所示:1.基准测试的代码文件必须以_test.go结尾。2.基准测试的函数必须...
-
Go单元测试(二):stub和mock
原文来自公众号:灰子学技术链接如下所示:Go单元测试之stub和mock一、前言介绍:对于我们平时开发的业务代码,单个函数往往不是独立的,它需要依赖于其他模块、第三方库、数据库、消息交互的结果等等。对于这种代码做单元测试,就会变得复杂许多,而对于当前要测试的函数来说,这些被依赖的其他函数,无非就是返回不同的数据而已。所以在做单元测试的时候,我们只需要让这些被依赖的其他函数返回我们期望的数据,就可以继续测试我们当前需要测试的函数。对于上面这种外部依赖的情况,我们往往采用两种办法来解决,一种是Moc...
-
Go单元测试(一): 基本用法
来自公众号:灰子学技术 原文链接一、单元测试的基本规则介绍Go的单元测试比较容易实现,因为Go语言为我们提供了单元测试的框架。而对于单元测试的框架需要遵循下面的几条规定。规则1.单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件规则2.单元测试的函数名必须以Test开头,是可导出公开的函数。备注:函数名最好是Test+要测试的方法函数名规则3. 测试函数的签名必须接收一个指向testing.T类型的指针作为参数,并且该测试函数不能返回任何值规则1: 例...
-
Go并发(六):Context篇
公众号灰子学技术:原文链接:https://mp.weixin.qq.com/s/0gBIz0q5GTWxhxJ2sYfsDw前言介绍:在学习Go并发的时候,我们总是能够看到context,而这个context却只在go语言中存在。笔者在看到context的时候,便问了自己几个问题。context是什么?是用来干什么的?我们为什么需要context? context是如何使用的?它为什么被设计成这个样子?基于上面的这些问题,笔者做了整理,笔者觉得在知道了这些问题的答案之后,context 也算是...
-
Go restful 基础
来自自己的公众号:灰子学技术。在学习Go的restful的时候,尝试着写了下,如何实现一个Web服务器,从最简单的代码一步步写起来,算是一个练习帖子吧。1.Go中Web服务的实现方式,采用Http库,主要用到了两个函数,HandleFunc和ListenAndServe,一个用来注册函数,一个用来监听端口并提供服务。2.Restful通过添加路由来实现Web服务,通过router的注册来实现解析规则和函数的注册。将router添加到ListenAndServe中,用来实现数据的响应。运行结...
-
Go并发(五):WaitGroup
转自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew)。但是对于一些简单的...
-
Go 并发(四):select篇
转载于公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/nJRVbhRQCgWHR1eHSfBpFA一、前言介绍:对于Go语言并发通讯,是使用的协程goroutine,而协程之间的通讯采用的是channel。但是channel不管是有缓存的,还是无缓存的都会有阻塞的情况出现,只不过无缓存的阻塞会更加频繁。而协程长时间阻塞了之后,Go语言本身又没有提供这种超时的解决机制,所以开发者需要自己考虑实现这种超时机制。这种超时机制在Go语言中则是使用select来解决的。相...
-
Go语言之循环语句
```灰子学技术: 原文链接:https://mp.weixin.qq.com/s/ITS8CjBup5ZmXPsdz30RQQ``` Go语言中的循环语句只有for,没有while和do/while这两种格式。 Go语言中的for语句的表达形式有三种实现方式: **1、基于计数器的实现。** 语法规则如下所示,这与C++的for循环实现模式基本类似,不过没有()。 ``` for i := 0; i<N; ++i { // 备注与C++的...
-
Go语言之“类”篇(一)
转自本同步公众号:“灰子学技术”原文链接:https://mp.weixin.qq.com/s/uiP6tAoLRj13RZRQMNOkKA准确来说,Go语言没有类的概念,不过却有struct和interface,这篇文章主要来讲struct,因为笔者觉得这个和C++中的Class有些相似。在C++中Class有几个东西,一定要谈,它们分别是:public/protected/private属性,构造函数和析构函数,继承,函数重载。一、公私有属性1.C++中的公私有属性,一定要有关键字publi...
-
Go并发之go语句使用篇
转自本同步公众号:“灰子学技术”原文链接:https://mp.weixin.qq.com/s/FD-MP9r5sEn1QYRAYZE_4ggo 语句是Go语言中新增的关键字,用来实现 goroutine的这种并发操作,C++中并没有这种操作操作,C++中的并发操做采用的是多线程,而本作者觉得,go的这种原理其实于线程池是有些类似的。(备注关于C++的线程池部分,后续在做整理。)一、并发和并行区别并发:逻辑上具有处理多个任务的能力。一般并发的数量要小于CPU的数量,这些并发的任务通过间隔执行的方...
-
Go并发之channel
转自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew学习channel的时候,笔者问了自己几个问题,个人觉得弄明白了这些问题,至少应该会使用channel了。本文也会从这些问题着手,来讲解channel。问题1: 什么是channel?是用来做什么的?1.channel是Go里面的一种类型,它是Go语言为goroutine提供的一种通讯机制,不同的goroutine需要通过channel来相互通讯。2.channel是...
-
Go语言之数组/Slice篇
转自“灰子学技术”公众号原文链接:https://mp.weixin.qq.com/s/UDsbIcQMl57ROgBij8xxzQ一、数组的语法介绍Go中的数组与C++中的数组含义并无不同,表示的都是具有相同唯一数据类型的一组已经编号并且长度固定的数组项序列。```var varName [SIZE]type // 备注:该格式是声明格式,变量名 + 数组大小 + 数据类型```数组初始化:数组的初始化基本上是以下例子中的几种格式```package mainimport ("fmt")fun...
-
Go语言之Map非并发安全
转自“灰子学技术”公众号原文链接:https://mp.weixin.qq.com/s/MAur04OmVPH5sb1tMFExNA一、问题描述:一次使用Go map的过程中,发现一个现象,map里面的元素是数据结构的话,该元素的属性不能直接赋值。会提示编译错误:./prog.go:11:15: cannot assign to struct field testMap[1].x in map例子如下:编译错误:./prog.go:11:15: cannot assign to struct ...
-
Go之Json的struct tag
转自“灰子学技术”公众号原文链接:https://mp.weixin.qq.com/s/W6yL8aqXvmU7Vyd0riWIJw最近使用go的json包的时候,有一个struct tag标识,关于它的使用规则如下所示:1.这个标识在json调用marshal做序列化操作的时候,会把key值解析为struct tag定义的值。2.如果没有这个标识,在Key值是大写的时候,会将这个值的名字解析为序列化之后的Key值。如果是小写就会忽略,这个是因为Go规定首字母是大写字母是公有,小写字母是私有导致...
-
Go 语言之switch
转发自自己的公众号(灰子学技术)原文链接:https://mp.weixin.qq.com/s/NpAmTMncDabMHcLwoyYegA一、区别switch语句是语言里面非常常见的语句,但是Go语言和C++对它的使用,却实在是迥异,差距非常之大。1.先从写法上面,C++中,switch之后紧跟括号,Go后面没有括号,甚至可以省略。2.switch后的变量类型,C++中必须是整型或者可以默认转换成整型的数据类型,Go中可以是任何类型。3.C++中case后面一般要跟break来终止当前case...
-
Go语言之continue/break label
转发自自己的公众号(灰子学技术)原文链接:https://mp.weixin.qq.com/s/kjGZsMJJdpOJbxlC1gs29w一、写在前面的话:最近碰到了,Go语言一个比较有趣的语法continue label和break label,这种语法C/C++却没有,但是却有与之类似的goto。不过C/C++中一般不喜欢也不推荐使用goto,原因是goto语句跳来跳去,很容易将代码的可读性降低,并且很容易出错,所以C/C++都不推荐使用goto语句。至于Go为何保留goto语句,想来是因...
-
Go语言之变量篇
转发自自己的公众号(灰子学技术)原文链接:https://mp.weixin.qq.com/s/m8iQdGu7g_8PX4s9mFbkDQ这篇文章便是笔者,在学习Go语言变量的时候,整理的一些知识。一、变量定义的格式C++的变量定义表达式如下所示:Type name = expression;,例如 int number = 10; // 表示的是 一个数据类型是int,名字叫做 number 的变量,它的初始值是 10。Go的变量定义表达式如下所示:var name type = expr...