![](https://img-blog.csdnimg.cn/b3dcf6d5ee8f4a8583df063f9df79ed0.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Go语言进阶
文章平均质量分 91
go
天涯泛孤舟
用技术展现更好的未来!
展开
-
12 | 指针详解:在什么情况下应该使用指针?
12 | 指针详解:在什么情况下应该使用指针?什么是指针我们都知道程序运行时的数据是存放在内存中的,而内存会被抽象为一系列具有连续编号的存储空间,那么每一个存储在内存中的数据都会有一个编号,这个编号就是内存地址。有了这个内存地址就可以找到这个内存中存储的数据,而内存地址可以被赋值给一个指针。小提示:内存地址通常为 16 进制的数字表示,比如 0x45b876。可以总结为:在编程语言中,指针是一种数据类型,用来存储一个内存地址,该地址指向存储在该内存中的对象。这个对象可以是字符串、整数、函数或者你原创 2022-08-30 15:14:14 · 1877 阅读 · 0 评论 -
11 | 并发模式:Go 语言中即学即用的高效并发模式
11 | 并发模式:Go 语言中即学即用的高效并发模式如何通过 Context 实现日志跟踪?要想跟踪一个用户的请求,必须有一个唯一的 ID 来标识这次请求调用了哪些函数、执行了哪些代码,然后通过这个唯一的 ID 把日志信息串联起来。这样就形成了一个日志轨迹,也就实现了用户的跟踪,于是思路就有了。在用户请求的入口点生成 TraceID。通过 context.WithValue 保存 TraceID。然后这个保存着 TraceID 的 Context 就可以作为参数在各个协程或者函数间传原创 2021-03-21 21:02:43 · 285 阅读 · 0 评论 -
09 | 同步原语:sync 包让你对并发控制得心应手
09 | 同步原语:sync 包让你对并发控制得心应手在 Go 语言中,不仅有 channel 这类比较易用且高级的同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步机制。通过它们,我们可以更加灵活地控制数据的同步和多协程的并发,下面我为你逐一讲解。资源竞争在一个 goroutine 中,如果分配的内存没有被其他 goroutine 访问,只在该 goroutine 中被使用,那么不存在资源竞争的问题。但如果同一块内存被多个 goroutine 同时访问,就会产生不原创 2021-03-21 19:45:00 · 210 阅读 · 0 评论 -
08 | 并发基础:Goroutines 和 Channels 的声明与使用
08 | 并发基础:Goroutines 和 Channels 的声明与使用什么是并发前面的文章中,写的代码都按照顺序执行,也就是上一句代码执行完,才会执行下一句,这样的代码逻辑简单,也符合我们的阅读习惯。但这样是不够的,因为计算机很强大,如果只让它干完一件事情再干另外一件事情就太浪费了。比如一款音乐软件,使用它听音乐的时候还想让它下载歌曲,同一时刻做了两件事,在编程中,这就是并发,并发可以让你编写的程序在同一时刻做多几件事情。进程和线程讲并发就绕不开线程,不过在介绍线程之前,我先为你介绍什么是进原创 2021-03-21 19:31:27 · 187 阅读 · 0 评论 -
07 | 错误处理:如何通过 error、deferred、panic 等处理错误?
07 | 错误处理:如何通过 error、deferred、panic 等处理错误?错误在 Go 语言中,错误是可以预期的,并且不是非常严重,不会影响程序的运行。对于这类问题,可以用返回错误给调用者的方法,让调用者自己决定如何处理。error 接口在 Go 语言中,错误是通过内置的 error 接口表示的。它非常简单,只有一个 Error 方法用来返回具体的错误信息,如下面的代码所示:type error interface { Error() string}在下面的代码中,我演示了一原创 2021-03-21 19:15:06 · 240 阅读 · 0 评论 -
06 | struct 和 interface:结构体与接口都实现了哪些功能?
06 | struct 和 interface:结构体与接口都实现了哪些功能?结构体结构体定义结构体是一种聚合类型,里面可以包含任意类型的值,这些值就是我们定义的结构体的成员,也称为字段。在 Go 语言中,要自定义一个结构体,需要使用 type+struct 关键字组合。在下面的例子中,我自定义了一个结构体类型,名称为 person,表示一个人。这个 person 结构体有两个字段:name 代表这个人的名字,age 代表这个人的年龄。type person struct { name s原创 2021-03-21 18:51:49 · 266 阅读 · 0 评论 -
05 | 函数和方法:Go 语言中的函数和方法到底有什么不同?
05 | 函数和方法:Go 语言中的函数和方法到底有什么不同?函数和方法是我们迈向代码复用、多人协作开发的第一步。通过函数,可以把开发任务分解成一个个小的单元,这些小单元可以被其他单元复用,进而提高开发效率、降低代码重合度。再加上现成的函数已经被充分测试和使用过,所以其他函数在使用这个函数时也更安全,比你自己重新写一个相似功能的函数 Bug 率更低。这里详细讲解 Go 语言的函数和方法,了解它们的声明、使用和不同。虽然在 Go 语言中有函数和方法两种概念,但它们的相似度非常高,只是所属的对象不同。我们先原创 2021-03-21 18:30:17 · 188 阅读 · 0 评论 -
04 | 集合类型:如何正确使用 array、slice 和 map?
04 | 集合类型:如何正确使用 array、slice 和 map?在实际需求中,我们会有很多同一类型的元素放在一起的场景,这就是集合,例如 100 个数字,10 个字符串等。在 Go 语言中,数组(array)、切片(slice)、映射(map)这些都是集合类型,用于存放同一类元素。Array(数组)数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。所存放的数据类型没有限制,可以是整型、字符串甚至自定义。数组声明要声明一个数组非常简单,语法和第二课时介绍的声明基础类型是一样的。原创 2021-03-21 18:19:14 · 137 阅读 · 0 评论 -
03 | 控制结构:if、for、switch 逻辑语句的那些事儿
03 | 控制结构:if、for、switch 逻辑语句的那些事儿在上节课中我留了一个思考题,在一个字符串中查找另外一个字符串是否存在,这个其实是字符串查找的功能,假如我需要在“飞雪无情”这个字符串中查找“飞雪”,可以这么做:i:=strings.Index("飞雪无情","飞雪")这就是 Go 语言标准库为我们提供的常用函数,以供我们使用,减少开发。Go 语言代码逻辑的控制。流程控制语句用于控制程序的执行顺序,这样你的程序就具备了逻辑结构。一般流程控制语句需要和各种条件结合使用,比如用于条件判原创 2021-03-21 17:59:00 · 135 阅读 · 0 评论 -
02 | 数据类型:你必须掌握的数据类型有哪些?
02 | 数据类型:你必须掌握的数据类型有哪些?上一章的思考题是打印出自己的名字,这个作业比较简单,属于文本的替换,你只需要把我示例中的"Hello 世界"修改成自己的名字即可,比如以我的名字为例,替换为“飞雪无情”。经过上一章的学习,你已经对 Go 语言的程序结构有了初步了解,也准备好了相应的开发环境。但是一个完整的项目需要更复杂的逻辑,不是简单的“Hello 世界”可相比的。这些逻辑通过变量、常量、类型、函数方法、接口、结构体组成,这节课我就将带你认识它们,让你的 Go 语言程序变得更加生动。变量原创 2021-03-21 17:50:49 · 294 阅读 · 0 评论 -
01 | 基础入门:编写你的第一个 Go 语言程序
01 | 基础入门:编写你的第一个 Go 语言程序从这里开始,我会带你走进 Go 语言的世界。我会用通俗易懂的语言,介绍 Go 语言的各个知识点,让你可以从零开始逐步学习,再深入它的世界。现在,让我以一个经典的例子“Hello World”来带你入门 Go 语言,了解它是如何运行起来的。Hello, 世界如果你学过 C 语言,对这个经典的例子应该不会陌生。通过它,我先带你大概了解一下 Go 语言的一些核心理念,让你对 Go 语言代码有个整体的印象。如下所示:ch01/main.gopackage原创 2021-03-21 17:14:25 · 141 阅读 · 0 评论