golang从入门到精通
文章平均质量分 93
go语法基础,函数,方法,面向对象,网络,并发编程,常用标准库。
框架: beego,gin,微服务
插件:文件读写,pprof性能调优,加解密,token,流控,数据库
实践项目:聊天室,游戏服务器
笔试面试题分析
前网易架构师-高司机
技术很烂,电子书《让你不再害怕指针》作者, 先后在IBM的Platform Computing,淘米网,网易搬砖,提供免费付费服务器架构设计,服务器疑难问题解决和优化方案,解决复杂的网络问题,提供深度学习相关数据集,商务合作+v(gao_ke104)。
展开
-
【go从入门到精通】rpc和grpc的使用
创建我们例子的第一步是定义一个服务:一个 RPC 服务通过参数和返回类型来指定可以远程调用的方法。gRPC 通过protocol buffers来实现。我们使用 protocol buffers 接口定义语言来定义服务方法,用 protocol buffer 来定义参数和返回类型。客户端和服务端均使用服务定义生成的接口代码。这里有我们服务定义的例子,在api/api.proto 里用 protocol buffers IDL 定义的。原创 2024-06-18 00:15:00 · 216 阅读 · 2 评论 -
【go从入门到精通】网络编程
接下来,我们需要掌握网络编程,TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网际协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。我的意思是,如果我们可以使用特定应用程序(例如 Nginx)的相同 IP: 端口打开一个套接字,我们就可以劫持内核通过该套接字发送给我们的部分请求。包还提供对 UDP 套接字的支持。原创 2024-06-14 00:15:00 · 209 阅读 · 1 评论 -
【go从入门到精通】精通并发编程-使用atomic管理状态和同步的无锁技术
Go 中的包sync/atomic提供了低级原子内存操作,确保状态更新以原子方式执行,而不受其他 goroutine 的干扰。在必须以原子方式完成多个进程或需要更复杂类型的同步的情况下,可能需要锁和其他同步技术。在 Go 中,原子计数器允许多个 goroutine 安全地更改共享变量,而无需使用锁或任何其他显式同步,这可确保数据完整性并避免竞争条件。大家从结果上就可以看出这差距不是一点点,当然不是所有的场景都无脑式的使用sync/atomic原子包,那我们接下来看下那些场景不适合。原创 2024-05-28 15:57:53 · 561 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-使用扇入扇出提升多个通道之间传递数据的效率
在并发编程领域,Golang 作为一种擅长处理并发的编程语言而脱颖而出。Go 并发模型的一个关键组件是通道,它允许 goroutine 进行通信并同步其工作。在这里,我们将探讨在 Go 中的多个通道之间传递数据的技术。当需要协调不同 goroutine 之间的工作并管理数据流时,这非常有用。了解 Go 通道在我们深入研究在多个通道之间传递数据之前,让我们简要回顾一下 Go 通道是什么以及它们如何工作。大家可以反看我之前的这篇文章:Go 通道是用于 goroutine 之间通信和同步的内置原语。原创 2024-05-24 00:15:00 · 45 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-sync.Map和map
另一方面,如果我们有大量写入工作负载,多个 goroutine 频繁更新数据,我们可能需要使用互斥锁或其他同步机制来确保一次只有一个 goroutine 可以访问数据。提供内置同步,对于读取繁重的工作负载很有用,但它有一些限制,并且比非并发使用的映射慢。通过了解这两种数据结构之间的差异和权衡,我们可以为我们的特定用例选择正确的一种,并优化我们的代码以提高性能和可扩展性。映射是无序键值对的集合,其中键是唯一的,值可以是任何类型。类型是 Go 中的内置类型,它为映射提供了安全且并发的替代方案,并在。原创 2024-05-23 00:15:00 · 265 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-sync.Once
提炼出来的,它使用 `atomic.StoreUint32` 将值设置为 1,表示该函数已被调用,然后使用 `atomic.LoadUint32` 来查看如果需要再次调用。无论有多少个 goroutine 调用它,atomic 包都会以安全的方式执行操作,这使得 `sync.Once` 和 `resync.Once` 是安全的。利用sync.Once,我们确保了只有在第一次调用时生成素数,之后的调用都可以快速获取之前生成好的素数。这样可以避免重复计算相同的素数,提高程序的效率。原创 2024-05-22 00:15:00 · 519 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-WaitGroup
Go 的 goroutine、通道和互斥体使得开发复杂的并发系统变得很容易。大多数问题都可以使用这三种机制来解决。正如我们前面提到的这篇文章,实际上协程是和很多知识点串起来的 , 并不是孤立的,因此在之前的这篇文章里,我将协程和channel,WaitGroup等知识点进行了综合,这篇文章又拆分来分享给大家。原创 2024-05-21 00:30:00 · 355 阅读 · 2 评论 -
【go从入门到精通】精通并发编程-Go Mutex 互斥锁
Go 中的互斥锁是什么?编程中的并发性需要保护数据并防止进程之间的冲突。Go 的sync.Mutex 通过控制对共享资源的访问来简化这一过程。在这篇文章中,我们将探索 Go 中的互斥体,了解如何使用它们,并了解它们如何帮助防止冲突。互斥体代表互斥,有助于确保共享内容不被大量 goroutine 同时搞乱。它就像一把钥匙,一次只有一个 goroutine 可以拥有来使用代码的特殊部分。没有它,事情可能会变得混乱并出错。互斥体可以阻止这种情况发生。它们是 Go 标准同步包的一部分。Go 中的互斥锁是什么?原创 2024-05-17 15:38:46 · 632 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-channel
什么是Channel?我们把channel翻译过来叫通道,通道可以被认为是 Goroutine 用来进行通信的管道,可以使用通道从一端发送数据并从另一端接收数据。默认情况下,通信是双向的,这意味着您可以从同一通道发送和接收值,这允许 goroutine 无需显式锁或条件变量即可同步。如果 goroutine 尝试从空通道读取数据,那么它将被阻塞,程序执行将继续等待,直到收到一个值。channel定义Channel可以被定义为全双工、仅传送、仅接收,模式不同。原创 2024-05-16 00:15:00 · 1028 阅读 · 0 评论 -
【go从入门到精通】使用 pprof 在 Go 中进行分析
当你看到有reflect.unsafe_NewArray的时候,你要小心,这里可能存在一些内存泄露或者不安全的使用方式, 我们可以使用traces reflect.unsafe_NewArray来查看使用的地方都有哪些.越大的盒子总是会对应它的使用情况,无论是CPU、内存等,所以在上面的例子中,我们看到的。通过此基本设置,在运行应用程序时,pprof 将公开您可以与之交互的端点,以开始收集应用程序上的配置文件。命令显示特定函数的配置文件数据摘要,包括其消耗的总 CPU 时间的百分比以及调用的次数。原创 2024-05-14 00:15:00 · 341 阅读 · 2 评论 -
【go从入门到精通】golang单元测试
上面的命令会将覆盖率相关的信息输出到当前文件夹下面的c.out文件中,然后我们执行go tool cover -html=c.out,使用cover工具来处理生成的记录信息,该命令会打开本地的浏览器窗口生成一个HTML报告。类型的参数b,基准测试必须要执行b.N次,这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性。文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。原创 2024-05-13 10:22:37 · 706 阅读 · 0 评论 -
【go从入门到精通】精通并发编程-协程goroutine
之前给大家分享了go的基础语法和代码示例。接下来不管你是否听说过,相比于传统的线程和锁机制,Go使用轻量级的协程(goroutine)和通道(channel)实现并发,使得并发性能发挥到极致。因此这篇文章算是一个介绍性的分享,让大家知道协程是什么?在分享协程之前,我们有必要回顾一下进程和线程,协程之间的关系和区别。原创 2024-05-11 15:02:39 · 730 阅读 · 4 评论 -
【go从入门到精通】go的debug调试技巧
作者简介:高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。在日常学习和开发过程中,我们会经常使用debug进行调试,为了探索各种奇奇怪怪的语法糖,为了解决一个疑难问题,为了修复一个bug...这一篇文章我将带来如何调试debug的技巧。原创 2024-05-09 00:15:00 · 586 阅读 · 0 评论 -
【go从入门到精通】go命令使用
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-05-08 00:15:00 · 583 阅读 · 0 评论 -
【go从入门到精通】由检查一个空结构体引发的思考?
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-05-07 00:15:00 · 796 阅读 · 0 评论 -
【go从入门到精通】探秘struct结构体转json为什么需要首字母大写?
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-05-06 11:52:51 · 2002 阅读 · 0 评论 -
【go从入门到精通】常用标准库的用法
在日常开发过程中,我们经常会和io文件操作类,net网络库,数据序列化和反序列化的json库,还有time时间库等打交道的非常多,因此这一节我将分享fmt,time和json库(官方的encoding/json和 github.com/json-iterator/go)。原创 2024-04-25 00:15:00 · 2034 阅读 · 0 评论 -
【go从入门到精通】Context用法分析
我们主要在并发期间使用Go Context。控制各种goroutine。我认为Go的并发性是最好的。这才是现代语言应该有的样子。Goroutine 就像风筝。一旦被释放,它就会飞翔直到工作完成。但是当你意识到你的 goroutine 遇到麻烦或者取消 goroutine 正在做的事情时,问题就会出现。但如何阻止风筝飞舞呢?我们可以借助不同的上下文来控制 goroutine,就像我们要借助风筝线和绳子来控制风筝一样。上下文充当父子。什么是Context在 Go(或 Golang)中,原创 2024-04-26 00:15:00 · 2175 阅读 · 0 评论 -
【go从入门到精通】反射的限制
首先,Bar 中的 Foo是一个匿名嵌入结构。在编译时,Go 会自动在 Bar 上生成与 Foo 上的方法相匹配的方法。你正在调用一个填充结构体实例的库,使用反射来分析结构体标签并在结构体的字段上设置值。如果调用一个带有interface{}类型参数的函数,那么它很可能会使用反射来检查或更改参数的值。好吧,就像我们能够利用 Go 对生成函数的支持来生成函数的包装器一样,我们也可以对接口执行相同的操作。但是,如果使用反射来构建具有嵌入字段的结构,并尝试访问这些字段上的方法,则可能会出现一些非常奇怪的行为。原创 2024-04-24 00:15:00 · 4408 阅读 · 0 评论 -
【go从入门到精通】深入剖析反射
大多数时候,Go 中的变量、类型和函数都非常简单。原创 2024-04-23 00:15:00 · 4489 阅读 · 0 评论 -
【go从入门到精通】深入探索接口interface
高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。接口作为 Go 语言类型系统中重要的一员,从语义上规定了一组方法集合,只定义方法的规范但不实现, 只要某个类型实现了这一组方法,则这些类型都可以视为同一类型参数进行传递。原创 2024-04-22 00:15:00 · 4445 阅读 · 1 评论 -
【go从入门到精通】结构体嵌套
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-04-19 00:15:00 · 11856 阅读 · 0 评论 -
【go从入门到精通】Golang 中最常见的 5 个错误
本文重点介绍了 Golang 中最常见的五个错误,并提供了每个错误的示例以及如何纠正这些错误。继续编码,从错误中学习,并探索 Go 提供的丰富功能和便利。使用通道时,确保发送和接收正确平衡,并且它们并行发生,通常在不同的 Goroutines 中。一个常见的错误是手动处理资源清理,这可能会导致问题,尤其是在清理之前发生错误时。在 Go 中,当一个类型实现了接口所需的所有方法时,就满足了接口的要求。Go 中的一个常见错误是没有正确实现接口,这通常是由于对 Go 中如何隐式满足接口的误解所致。原创 2024-04-18 00:15:00 · 13186 阅读 · 0 评论 -
【go从入门到精通】吃透panic和recover
什么时候可以Panic呢?错误处理是每个编程语言都要考虑的一个重要话题。在C语言中,默认采用一个整数类型的errno来表达错误,这样就可以根据需要定义多种错误类型。在Go语言中,就是对应C语言中errno类型的错误。在syscall包中的接口,如果有返回错误的话,底层也是错误类型。什么是panic?panic是一种破坏应用程序状态并使其无限期停止的调用。与 C 风格的编程类似,Go 将错误视为第一类值,因此panic更像是用户自愿发出的运行时错误。这个用法我觉得和其他语言里的throw很类似。原创 2024-04-17 00:15:00 · 13511 阅读 · 0 评论 -
【go从入门到精通】探索延迟调用(defer)用法和陷阱
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-04-16 00:15:00 · 1357 阅读 · 0 评论 -
【go从入门到精通】全面掌握struct结构体的成员函数
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-04-12 00:15:00 · 12552 阅读 · 0 评论 -
【go从入门到精通】初识struct结构体
在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。const (RANKTYPE_GLOBAL_DECORATE RANKTYPE = 0 //全服装扮排名RANKTYPE_PRIVANCE_DECORATE RANKTYPE = 1 //省级装扮排名。原创 2024-04-10 00:15:00 · 12474 阅读 · 0 评论 -
【go从入门到精通】struct结构体的内存布局问题
先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。原创 2024-04-11 00:15:00 · 675 阅读 · 0 评论 -
【go从入门到精通】代码规范
代码规范:使用辅助工具帮助我们在每次提交 PR 时自动化地对代码进行检查,减少工程师人工审查的工作量;最佳实践目录结构:遵循 Go 语言社区中被广泛达成共识的目录结构,减少项目的沟通成本;模块拆分:按照职责对不同的模块进行拆分,Go 语言的项目中也不应该出现modelcontroller这种违反语言顶层设计思路的包名;显示与隐式:尽可能地消灭项目中的init函数,保证显式地进行方法的调用以及错误的处理;原创 2024-04-09 00:15:00 · 25039 阅读 · 2 评论 -
【go从入门到精通】作用域,包详解
而闭包函数,GetGa()返回的匿名函数,赋值给b,每次执行b(),Ga的值都被记忆在内存中,下次执行b()的时候,取b()上次执行后Ga的值,而不是全局变量Ga的值,这就是闭包函数可以使用包含它的函数内的变量,因为作为代码块一直存在,所以每次执行都是在上次基础上运行。在代码中使用big.Int时,big指的才是.go文件中定义的包名称。当某个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init()函数(如果有的话),依次类推。原创 2024-04-08 00:15:00 · 24891 阅读 · 1 评论 -
【go从入门到精通】常量和枚举详解
作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注)——————————————————————————————————————————常量是指程序在执行过程中不能改变的固定值。常量可以是任何基本数据类型,例如整型常量、浮点常量、字符常量或原创 2024-04-07 00:15:00 · 25490 阅读 · 0 评论 -
【go从入门到精通】一文把map字典搞得明明白白
key 可以是任意可以用 == 或者!= 操作符比较的类型,比如 string、int、float。所以数组、函数、字典、切片和结构体不能作为 key (含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的),但是指针和接口类型可以。value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言。map 也可以用函数作为自己的值,这样就可以用来做分支结构:key 用来选择要执行的函数。原创 2024-04-03 00:15:00 · 32998 阅读 · 2 评论 -
【go从入门到精通】匿名函数详解
函数值字面量是一种表达式,它的值被称为匿名函数。从形式上看当我们不给函数起名字的时候,可以使用匿名函数,例如:不过我们经常用下面这两种方式使用匿名函数的:1.将匿名函数赋值给一个变量,然后通过这个变量调用函数的方式来实现对匿名函数的调用。原创 2024-03-28 00:15:00 · 51416 阅读 · 3 评论 -
【go从入门到精通】函数详解
Go语言函数基本组成:关键字func、函数名、参数列表、返回值、函数体和返回语句。func 函数名(参数列表) (返回值列表) {// 函数体return函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语句。有点简单,很多做C,C++开发的都知道声明函数原型是一件有点冗余的事情,而转到go之后,你会发现go函数用起来便轻松简洁很多,至少不需要你声明函数原型。那么我们接下来一起先看看go函数都有哪些特点:• 无需声明原型。• 支持不定 变参。• 支持多返回值。原创 2024-03-27 09:15:51 · 60701 阅读 · 1 评论 -
【go从入门到精通】for和for range的区别
for 和 for range有什么区别?for可以遍历array和slice,遍历key为整型递增的map,遍历stringfor range可以完成所有for可以做的事情,却能做到for不能做的,包括遍历key为string类型的map并同时获取key和value,遍历channel所以除此之外还有其他区别吗?我们来用几个代码块说明他们的区别不仅仅是上面的这几点原创 2024-03-26 00:15:00 · 52144 阅读 · 4 评论 -
【go从入门到精通】闭包和陷阱
高科,先后在上一篇文章当时写完,总是感觉意犹未尽,从匿名函数我联想到了另外一个用法————闭包。原创 2024-03-25 01:00:00 · 51151 阅读 · 2 评论 -
【go从入门到精通】select条件控制
接着上一篇文章,, 我们再聊一下条件语句的另外一个关键词 select。原创 2024-03-22 06:00:00 · 51214 阅读 · 4 评论 -
【go从入门到精通】for循环控制
Go 语言提供了for循环语句,用于重复执行一段程序逻辑,直到循环条件不再满足时终止。循环可以用于迭代各种数据结构(例如切片、数组、映射或字符串)中的元素本文将很基础的for循环语法,循环嵌套,无限循环,goto,break,continue呈现给正在学习go开发的读者。原创 2024-03-21 06:45:00 · 52077 阅读 · 9 评论 -
【go从入门到精通】if else 条件控制
或者最终结果为相同类型的表达式。在 Go 语言中,条件语句用于根据不同的条件执行不同的代码。if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。if 嵌套语句 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。if 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则执行 else 语句块。if 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。原创 2024-03-20 13:43:07 · 50846 阅读 · 0 评论 -
【go从入门到精通】一文把指针整的明明白白
什么是指针?指针是一种存储变量内存地址的变量。指针有什么用?在Go语言中,指针是一种特殊的变量,它存储了一个变量的内存地址。通过指针,我们可以直接访问和修改变量的值,而不需要拷贝变量本身,这样可以提高程序的效率。指针在Go语言中有以下几个作用:传递变量的地址:指针可以作为函数参数,将变量的地址传递给函数,这样函数就可以直接修改变量的值。动态分配内存:通过指针可以在运行时动态分配内存,这样程序就可以根据需要动态地创建和销毁变量。原创 2024-03-11 00:15:00 · 53065 阅读 · 3 评论