
Go
文章平均质量分 88
程序员贝塔
这个作者很懒,什么都没留下…
展开
-
微服务架构|go-zero 的自适应熔断器
上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断。熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会处理,但熔断不是。在一条调用链上,如果发现某个服务异常,比如响应超时。那么调用者为了避免过多请求导致资源消耗过大,最终引发系统雪崩,会直接返回错误,而不是疯狂调用这个服务。本篇文章会介绍主流熔断器的工作原理,并且会借助 go-zero 源码,分析 googleBreaker 是如何通过滑动窗口来统计流量,并且最终执行熔断的。原创 2023-09-02 12:20:26 · 987 阅读 · 2 评论 -
Go 语言中排序的 3 种方法
使用sort.Slice方法排序时,可以自定义比较函数,这样就可以根据需要按不同的字段进行排序。如果想要稳定排序的话,就使用方法。Age int}{})使用sort.Sort或者方法,它们可以对任意实现了的数据结构排序。Len() int意思就是说,只要某一个数据结构实现了Len() int和这三个方法,那么就可以使用sort.Sort来排序。Age int。原创 2023-08-18 20:07:39 · 1162 阅读 · 0 评论 -
go-zero 是如何实现令牌桶限流的?
上一篇文章介绍了主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码。这篇文章来介绍一下令牌桶算法,可以很好解决以上两个问题。原创 2023-08-10 20:43:38 · 628 阅读 · 0 评论 -
go-zero 是如何实现计数器限流的?
上一篇文章介绍了路由管理,这篇文章来说说限流,主要介绍计数器限流算法,具体的代码实现,我们还是来分析微服务框架 go-zero 的源码。在微服务架构中,一个服务可能需要频繁地与其他服务交互,而过多的请求可能导致性能下降或系统崩溃。为了确保系统的稳定性和高可用性,限流算法应运而生。限流算法允许在给定时间段内,对服务的请求流量进行控制和调整,以防止资源耗尽和服务过载。下面分别来介绍。原创 2023-08-09 22:28:02 · 847 阅读 · 0 评论 -
go-zero 是如何做路由管理的?
const (type (// 节点root *node重点说一下children,它是一个包含两个元素的数组,元素0存正常路由键,元素1存以开头的路由键,这些是 url 中的变量,到时候需要替换成实际值。举一个例子,有这样一个路由/api/:user,那么api会存在user会存在。// 判断路由是不是以 : 开头。原创 2023-08-09 22:00:50 · 388 阅读 · 0 评论 -
使用 Go 语言实现二叉搜索树
二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。它有很多变种,比如红黑树,常被用作std::map和std::set的底层实现;B 树和 B+ 树,广泛应用于数据库系统中。本文要介绍的二叉搜索树用的也很多,比如在开源项目 go-zero 中,就被用来做路由管理。这篇文章也算是一篇前导文章,介绍一些必备知识,下一篇再来介绍具体在 go-zero 中的应用。原创 2023-08-01 19:32:45 · 583 阅读 · 0 评论 -
Go 语言 select 都能做什么?
在 Go 语言中,select是一个关键字,用于监听和channel有关的 IO 操作。通过select语句,我们可以同时监听多个channel,并在其中任意一个channel就绪时进行相应的处理。本文将总结一下select语句的常见用法,以及在使用过程中的注意事项。原创 2023-07-28 20:54:47 · 425 阅读 · 0 评论 -
Go 语言 context 都能做什么?
很多 Go 项目的源码,在读的过程中会发现一个很常见的参数ctx,而且基本都是作为函数的第一个参数。为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。开局一张图:核心是ContextDone()Err()Deadline()Value()emptyCtxcancelCtxtimerCtx和valueCtx。其中emptyCtx一般情况下,会使用作为根 ctx,然后在其基础上再派生出子 ctx。要是不确定使用哪个 ctx,就使用TODO()。原创 2023-07-02 12:38:04 · 256 阅读 · 0 评论 -
为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。如果一定要这么做的话,需要对字符串进行一个转换,转换成。以上就是本文的全部内容,如果觉得还不错的话欢迎。和切片的结构很像,只不过少了一个表示容量的。切片,然后让指针指向了新的地址。Go 实际上是重新创建了一个。类型,修改之后再转换回。原创 2023-06-02 19:42:00 · 393 阅读 · 0 评论 -
Go 语言 map 如何顺序读取?
Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。原创 2023-05-27 09:50:19 · 1220 阅读 · 0 评论 -
Go 语言 map 是并发安全的吗?
因为它没有内置的锁机制来保护多个 goroutine 同时对其进行读写操作。当多个 goroutine 同时对同一个 map 进行读写操作时,就会出现数据竞争和不一致的结果。就像上例那样,当两个 goroutine 同时尝试更新同一个键值对时,最终的结果可能取决于哪个 goroutine 先完成了更新操作。这种不确定性可能会导致程序出现错误或崩溃。Go 语言团队没有将 map 设计成并发安全的,是因为这样会增加程序的开销并降低性能。原创 2023-05-27 09:39:15 · 1502 阅读 · 0 评论 -
为什么 Go for-range 的 value 值地址每次都一样?
循环语句是一种常用的控制结构,在 Go 语言中,除了for关键字以外,还有一个range关键字,可以使用for-range循环迭代数组、切片、字符串、map 和 channel 这些数据类型。但是在使用for-range循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里翻车。具体是怎么翻的呢?我们接着看。原创 2023-04-30 15:07:56 · 760 阅读 · 1 评论 -
Go 语言切片是如何扩容的?
切片扩容通常是在进行切片的append操作时触发的。在进行append操作时,如果切片容量不足以容纳新的元素,就需要对切片进行扩容,此时就会调用growslice函数进行扩容。如果期望容量大于当前容量的两倍就会使用期望容量;如果当前切片的长度小于 1024 就会将容量翻倍;如果当前切片的长度大于 1024 就会每次增加 25% 的容量,直到新容量大于期望容量;如果期望容量大于当前容量的两倍就会使用期望容量;如果当前切片的长度小于阈值(默认 256)就会将容量翻倍;原创 2023-04-09 17:24:34 · 577 阅读 · 1 评论 -
Go 语言数组和切片的区别
数组是一个长度固定的数据类型,其长度在定义时就已经确定,不能动态改变;切片是一个长度可变的数据类型,其长度在定义时可以为空,也可以指定一个初始长度。数组的内存空间是在定义时分配的,其大小是固定的;切片的内存空间是在运行时动态分配的,其大小是可变的。当数组作为函数参数时,函数操作的是数组的一个副本,不会影响原始数组;当切片作为函数参数时,函数操作的是切片的引用,会影响原始切片。切片还有容量的概念,它指的是分配的内存空间。以上就是本文的全部内容,如果觉得还不错的话欢迎转发和关注。原创 2023-04-02 12:00:57 · 600 阅读 · 0 评论 -
Go 语言 new 和 make 关键字的区别
make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据;new 分配返回的是指针,即类型*Type。make 返回类型本身,即Type;new 分配的空间被清零。make 分配空间后,会进行初始化;以上就是本文的全部内容,如果觉得还不错的话欢迎转发和关注为什么 Go 不支持 []T 转换为 []interface为什么 Go 语言 struct 要使用 tags。原创 2023-03-26 21:06:12 · 391 阅读 · 0 评论 -
为什么 Go 语言 struct 要使用 tags
在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。在本文中,我们将探讨为什么 Go 语言中需要使用 struct tags,以及 struct tags 的使用场景和优势。原创 2023-03-11 14:11:14 · 295 阅读 · 0 评论 -
为什么 Go 不支持 []T 转换为 []interface
在 Go 中,如果作为函数参数的话,是可以传任意参数的,然后通过来转换。不管是传int还是string,最终都能输出正确结果。那么,既然是这样的话,我就有一个疑问了,拿出我举一反三的能力。是否可以将[]T转换为呢?很遗憾,这段代码是不能编译通过的,如果想直接通过本来一行代码就能搞定的事情,却非要让人写四行,是不是感觉很麻烦?那为什么 Go 不支持呢?我们接着往下看。原创 2023-01-30 12:36:14 · 486 阅读 · 1 评论 -
推荐 10 本 Go 经典书籍,从入门到进阶
书单一共包含 10 本书,分为入门 5 本,进阶 5 本。我读过其中 7 本,另外 3 本虽然没读过,但也是网上推荐比较多的。虽然分了入门和进阶,但是很多书中这两部分内容是都包含了的。大家看的时候可以根据自己的情况,先打好基础,再进行进阶。有的书是开原创 2022-03-03 23:25:54 · 2942 阅读 · 0 评论 -
读 Go 源码,可以试试这个工具
原文链接: 读 Go 源码,可以试试这个工具编程发展至今,从面向过程到面向对象,再到现在的面向框架。写代码变成了一件越来越容易的事情。学习基础语法,看看框架文档,几天时间搞出一个小项目并不是一件很难的事情。但时间长了就会发现,一直这样飘在表面是不行的,技术永远得不到提升。想要技术水平有一个质的飞跃,有一个很好的方法,就是读源码。但读源码真的是一件很有挑战的事情。想想当年自己读 Django 源码,从启动流程开始看,没走几步就放弃了,而且还放弃了很多次。这么说吧,我对 Django 启动部分的代原创 2022-02-08 22:24:47 · 1302 阅读 · 0 评论 -
Go 学习路线(2022)
原文链接: Go 学习路线(2022)Go 语言的发展越来越好了,很多大厂使用 Go 作为主要开发语言,也有很多人开始学习 Go,准备转 Go 开发。那么,怎么学呢?我发现,在互联网时代,学习的困难不是说没有资料,而是资料太多,不知道应该看哪个,从哪开始看。所以,我整理了一份 Go 学习路线,这份学习路线不以数量取胜,努力做到精简。从基础到进阶,从理论到实战,一共包括以下几个内容:入门教程进阶教程书籍推荐Web 开发练手项目实用工具技术社区这份学习路线还会不断优化更新,感兴趣的原创 2022-02-07 23:13:05 · 8414 阅读 · 2 评论 -
Go Error 嵌套到底是怎么实现的?
原文链接: Go Error 嵌套到底是怎么实现的?Go Error 的设计哲学是 「Errors Are Values」。这句话应该怎么理解呢?翻译起来挺难的。不过从源码的角度来看,好像更容易理解其背后的含义。Go Error 源码很简单,寥寥几行:// src/builtin/builtin.gotype error interface { Error() string}error 是一个接口类型,只需要实现 Error() 方法即可。在 Error() 方法中,就可以返回自定义结构原创 2022-01-14 14:02:54 · 276 阅读 · 0 评论 -
为什么要避免在 Go 中使用 ioutil.ReadAll?
ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾。在 GitHub 上搜索 ioutil.ReadAll,类型选择 Code,语言选择 Go,一共得到了 637307 条结果。这说明 ioutil.ReadAll 还是挺受欢迎的,主要也是用起来确实方便。但是当遇到大文件时,这个函数就会暴露出两个明显的缺点:性能问题,文件越大,性能越差。文件过大的话,可能直接撑爆内存,导致程序崩溃。为什么会这样呢?这篇文章就通过源码来分析背后的原因,并试图给出更好的解决方案。下面原创 2022-01-06 14:33:03 · 2699 阅读 · 0 评论 -
如何在 Go 中将 []byte 转换为 io.Reader?
原文链接: 如何在 Go 中将 []byte 转换为 io.Reader?在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果想要将其转换成 io.Reader,需要怎么做呢?这个问题解决起来并不复杂,简单几行代码就可以轻松将其转换成功。不仅如此,还可以再通过几行代码反向转换回来。下面听我慢慢给你吹,首先直接看两段代码。[]byte 转 io.Readerpackage mainimport ( "bytes" "fmt" "log"原创 2021-12-29 12:27:42 · 4086 阅读 · 0 评论 -
Go 的 golang.org/x/ 系列包和标准库包有什么区别?
在开发过程中可能会遇到这样的情况,有一些包是引入自不同地方的,比如:golang.org/x/net/html 和 net/html,golang.org/x/crypto 和 crypto。那这是什么原因呢?引用 Go 官方 Wiki 的说法:The golang.org/x/… repositories are part of the Go Project but outside the main Go tree.They are developed under looser co原创 2021-12-23 13:03:48 · 3077 阅读 · 0 评论 -
开始读 Go 源码了
原文链接: 开始读 Go 源码了学完 Go 的基础知识已经有一段时间了,那么接下来应该学什么呢?有几个方向可以考虑,比如说 Web 开发,网络编程等。在下一阶段的学习之前,写了一个开源项目|Go 开发的一款分布式唯一 ID 生成系统,如果你对这个项目感兴趣的话,可以在 GitHub 上拿到源码。在写项目的过程中,发现一个问题。实现功能是没问题的,但不知道自己写的代码是不是符合 Go 的风格,是不是够优雅。所以我觉得相比于继续学习应用开发,不如向底层前进,打好基础,打好写 Go 代码的基础。所以,我决原创 2021-12-03 12:29:55 · 626 阅读 · 0 评论 -
开源项目|Go 开发的一款分布式唯一 ID 生成系统
原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID。上周停更了一周,也是用来开发和测试这个项目的相关代码。美团有一个开源项目叫 Leaf,使用 Java 开发。本项目就是在此思路的基础上,使用 Go 开发实现的。项目整体代码量并不多,不管是想要在实际生产环境中使用,还是想找个项目练手,我觉得都是一个不错的选择。项目背景在大部分系统中,全局唯一 ID 都是一个强需求。比如快递,外卖,电影等,都需要生原创 2021-11-09 20:09:31 · 919 阅读 · 0 评论 -
测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她
原文链接: 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她上篇文章 gRPC,爆赞 直接爆了,内容主要包括:简单的 gRPC 服务,流处理模式,验证器,Token 认证和证书认证。在多个平台的阅读量都创了新高,在 oschina 更是获得了首页推荐,阅读量到了 1w+,这已经是我单篇阅读的高峰了。看来只要用心写还是有收获的。这篇咱们还是从实战出发,主要介绍 gRPC 的发布订阅模式,REST 接口和超时控制。相关代码我会都上传到 GitHub,感兴趣的小伙伴可以去查看或下载。发布和订原创 2021-10-25 20:12:21 · 224 阅读 · 0 评论 -
听说,99% 的 Go 程序员都被 defer 坑过
原文链接: 听说,99% 的 Go 程序员都被 defer 坑过先声明:我被坑过。之前写 Go 专栏时,写过一篇文章:Go 专栏|错误处理:defer,panic 和 recover。有小伙伴留言说:道理都懂,但还是不知道怎么用,而且还总出现莫名奇妙的问题。出问题就对了,这个小东西坏的很,一不留神就出错。所以,面对这种情况,我们今天就不讲道理了。直接把我珍藏多年的代码一把梭,凭借多年踩坑经历和写 BUG 经验,我要站着把这个坑迈过去。一、先来一个简单的例子热热身:package maini原创 2021-10-18 21:50:59 · 233 阅读 · 0 评论 -
gRPC,爆赞
原文链接: gRPC,爆赞gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。作为一名程序员,学就对了。之前用 Python 写过一些 gRPC 服务,现在准备用 Go 来感受一下原汁原味的 gRPC 程序开发。本文的特点是直接用代码说话,通过开箱即用的完整代码,来介绍 gRPC 的各种使用方法。代码已经上传到 GitHub,下面正式开始。介绍gRPC 是 Google 公司基于 Protobuf 开发的跨语言的开源 RPC 框架。gRPC 基于 HT原创 2021-10-12 20:18:41 · 398 阅读 · 1 评论 -
使用 grpcurl 通过命令行访问 gRPC 服务
原文链接: 使用 grpcurl 通过命令行访问 gRPC 服务一般情况下测试 gRPC 服务,都是通过客户端来直接请求服务端。如果客户端还没准备好的话,也可以使用 BloomRPC 这样的 GUI 客户端。如果环境不支持安装这种 GUI 客户端的话,那么有没有一种工具,类似于 curl 这样的,直接通过终端,在命令行发起请求呢?答案肯定是有的,就是本文要介绍的 grpcurl。gRPC Server首先来写一个简单的 gRPC Server:helloworld.proto:syntax =原创 2021-09-30 14:50:27 · 8770 阅读 · 0 评论 -
Go 专栏|并发编程:goroutine,channel 和 sync
原文链接: Go 专栏|并发编程:goroutine,channel 和 sync优雅的并发编程范式,完善的并发支持,出色的并发性能是 Go 语言区别于其他语言的一大特色。在当今这个多核时代,并发编程的意义不言而喻。使用 Go 开发并发程序,操作起来非常简单,语言级别提供关键字 go 用于启动协程,并且在同一台机器上可以启动成千上万个协程。下面就来详细介绍。goroutineGo 语言的并发执行体称为 goroutine,使用关键词 go 来启动一个 goroutine。go 关键词后面必须跟一原创 2021-09-16 20:18:11 · 259 阅读 · 0 评论 -
Go 专栏|接口 interface
原文链接: Go 专栏|接口 interfaceDuck Typing,鸭子类型,在维基百科里是这样定义的:If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.翻译过来就是:如果某个东西长得像鸭子,游泳像鸭子,嘎嘎叫像鸭子,那它就可以被看成是一只鸭子。它是动态编程语言的一种对象推断策略,它更关注对象能做什么,而不是对象的类型本身。例如:在动态语言 Pytho原创 2021-08-31 19:31:01 · 191 阅读 · 0 评论 -
Go 专栏|说说方法
原文链接: Go 专栏|说说方法最近又搬家了,已经记不清这是第几次搬家了。搬到了公司附近,走路十分钟,以后加班可方便了。这一篇来说一说方法,方法可以看作是某种特定类型的函数,是 Go 面向对象编程的第一步。用好方法,具备面向对象编程思想是关键。声明方法的声明和函数类似,他们的区别是:方法在定义的时候,会在 func 和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。type Person struct { name string原创 2021-08-26 20:14:15 · 126 阅读 · 0 评论 -
Go 专栏|错误处理:defer,panic 和 recover
最近校招又开始了,我也接到了一些面试工作,当我问「你觉得自己有什么优势」时,十个人里有八个的回答里会有一条「精力充沛,能加班」。怪不得国家都给认证了:新生代农民工。合着我们这根本就不是什么脑力劳动者,而是靠出卖体力的苦劳力。好了,废话不多说,肝文还确实需要体力。这篇来说说 Go 的错误处理。错误处理错误处理相当重要,合理地抛出并记录错误能在排查问题时起到事半功倍的作用。Go 中有关于错误处理的标准模式,即 error 接口,定义如下:type error interface { Error(原创 2021-08-24 09:07:50 · 265 阅读 · 0 评论 -
推荐三个实用的 Go 开发工具
孙悟空在花果山称王的时候,特意去了一趟东海,在那里淘到了如意金箍棒。因为身为一个山大王,怎么能没有一件趁手的兵器呢?作为程序员的我们也一样,除了我们的傍身武器 Ctrl C + V 之外,还要不停的补充我们的武器库。不仅要把 Ctrl C + V 用的高级,更要用的恰到好处。今天介绍三款小工具,分别可以将 json,yaml 和 table 转成 Go 的 struct。下次再碰到这样的转换场景,再也不用皱眉挠头了,一键轻松搞定。前两个直接在线转换,最后一个需要安装一个库,但也很方便。json-to原创 2021-08-14 10:17:33 · 2894 阅读 · 2 评论 -
Go 专栏|函数那些事
曾经很长一段时间,我都为自己是互联网科技公司的一员而感到自豪,我觉得我们与众不同。我们的管理更扁平化,没有那么多官僚主义,充满活力,朝气蓬勃。而且我们的产品正在改变大家的衣食住行,我们正在改变世界。但近几年发生的一系列事件,都让我的信心产生动摇,不停在捶打我:醒醒吧,兄弟,事实不是你想象的那样。我能做些什么呢?不知道。还是努力更文吧,争取早日不做打工人。函数定义函数包括以下几个部分:关键词 func,函数名,参数列表,返回列表和函数体。func name(param-list) ret-lis原创 2021-08-11 18:39:45 · 160 阅读 · 0 评论 -
Go 专栏|流程控制,一网打尽
最近看奥运会看的我热血沸腾,中国奥运健儿简直太棒了,不只是成绩,还有气质,精气神,全方位的棒。而且这次奥运会我觉得最感动的是,看到一些年纪大的运动员拿了好成绩:吕小军 37 岁,马龙 32,苏炳添 32,巩立姣 32 岁才拿了自己的第一块奥运金牌。连这么受限于年龄的运动员都能不断突破自己,何况我们呢?还每天在网上焦虑程序员 35 岁就要被优化?所以别给自己找年龄作为借口了,觉得年龄大了这不行那不行,干就完事了。if-else特点:条件语句不需要使用小括号 () 包起来;花括号 {} 必须有,并原创 2021-08-05 22:04:25 · 139 阅读 · 0 评论 -
Go 专栏|复合数据类型:字典 map 和 结构体 struct
楼下新开了一家重庆砂锅肥肠,扩音喇叭一直在放:正宗的老重庆砂锅肥肠,麻辣可口,老巴适了。正不正宗不知道,反正听口音,我以为我回东北了。本篇介绍复合数据类型的最后一篇:字典和结构体。内容很重要,编程时用的也多,需要熟练掌握才行。本文所有代码基于 go1.16.6 编写。字典字典是一种非常常用的数据结构,Go 中用关键词 map 表示,类型是 map[K]V。K 和 V 分别是字典的键和值的数据类型,其中键必须支持相等运算符,比如数字,字符串等。创建字典有两种方式可以创建字典,第一种是直接使用原创 2021-08-03 16:35:45 · 660 阅读 · 3 评论 -
Go 专栏|复合数据类型:数组和切片 slice
公司 Tony 老师这两天请假,找来了他的好朋友 Kevin 顶班,这两个人的风格真是相差十万八千里。Tony 性格缓慢,手法轻柔。到底有多轻呢?洗头发的时候我都怀疑他是不是怕把我头发弄湿。Kevin 则完全不同,嗓音洪亮,风风火火。说是洗头发,但我感觉他就是在扇我脑袋。眼前水花四溅,雾气缭绕,仿佛都能看见彩虹。理发的小感受,夸张了点儿。经过上一篇的学习,对 Go 应该已经越来越有感觉了,今天来点更高级的内容:复杂数据类型。本篇主要介绍数组和切片 slice,开整~本文所有代码基于 go1.1原创 2021-08-02 21:19:51 · 157 阅读 · 0 评论 -
Go 专栏|基础数据类型:整数、浮点数、复数、布尔值和字符串
Go 专栏的第三篇,本文内容依旧很基础,很简单。如果有编程经验的话,可能扫一眼就了然于胸了。但如果刚开始接触编程,建议还是好好看看,把文中的代码 demo 都自己跑一遍。只有基础打好了,才能向更高的目标迈进。话不多说,走起~Go 的数据类型分四大类:基础类型: 数字 number,字符串 string 和布尔型 boolean。聚合类型: 数组 array 和结构体 struct。引用类型: 指针 pointer,切片 slice,字典 map,函数 func 和通道 channel。接口类.原创 2021-07-23 08:10:06 · 1506 阅读 · 1 评论