Go
文章平均质量分 84
Go语言
Lamb!
这个作者很懒,什么都没留下…
展开
-
Golang 并发控制方式有哪些
Go语言中的goroutine是一种轻量级的线程,其优点在于占用资源少、切换成本低,能够高效地实现并发操作。但如何对这些并发的goroutine进行控制呢?一提到并发控制,大家最先想到到的是锁。Go中同样提供了锁的相关机制,包括互斥锁sync.Mutex和读写锁sync.RWMutex;除此之外Go还提供了原子操作sync/atomic。但这些操作都是针对并发过程中的数据安全的,并不是针对goroutine本身的。本文主要介绍的是对goroutine并发行为的控制。和。原创 2024-02-02 17:58:21 · 1199 阅读 · 0 评论 -
Go 为什么建议使用切片,少使用数组?
本文我们介绍 Go 语言为什么建议多使用切片,少使用数组。主要是因为切片值传递的成本更低,更加适合作为函数参数,并且使用内置函数 append追加切片元素时,当切片容量不足时可以自动扩容。需要注意的是,虽然切片可以自动扩容,但在扩容时会涉及内存分配,造成系统开销,尽量在创建切片时,预估出切片的最终容量。原创 2024-01-26 10:41:09 · 703 阅读 · 0 评论 -
Go 如何应对高并发 | 高并发详解
并发编程是当前软件领域中一个重要的概念。Go语言通过goroutine和channel的特性,天生支持高并发处理,充分利用现代CPU的多核优势。与Java相比,Go语言的协程更加轻量级,可以轻松创建上百万个协程。Go语言的调度器采用GPM调度模型,通过将协程放入队列中,由调度器分配给CPU处理。此外,Go语言采用CSP模型,通过channel实现协程之间的通信,避免了共享内存带来的竞态问题。相比之下,Go语言的Mutex锁更轻量、灵活,并且具有更高的性能。原创 2024-01-26 09:56:07 · 1325 阅读 · 0 评论 -
Go 条件控制语句
在 Go 语言中,主要的条件控制语句有 if-else、switch和 select。原创 2023-12-27 17:04:35 · 1110 阅读 · 0 评论 -
二叉树简介
二叉树是计算机科学中一种重要的数据结构,它在许多应用领域中都有广泛的用途。本文将介绍二叉树的概念、性质、常见类型和应用。二叉树是一种树形数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。这两个子节点可以为空,也可以包含数据或值。二叉树是一种层次结构,根节点位于树的顶部,其他节点按照层级依次排列。原创 2023-12-01 10:03:05 · 465 阅读 · 0 评论 -
Redis 如何批量删除指定前缀的Key
批量删除指定前缀的Key有两中方法,一种是借助 redis-cli,另一种是通过 SCAN命令来遍历所有匹配前缀的 key,并使用 DEL命令逐个删除它们。原创 2023-11-30 15:33:43 · 2693 阅读 · 0 评论 -
什么是gRPC
使用 Protocol Buffers 进行接口定义,语法简洁清晰,易于阅读和维护。支持请求和响应中的复杂数据结构,并提供了方便的工具来生成客户端和服务端的代码。原创 2023-11-30 10:51:29 · 174 阅读 · 0 评论 -
Go 从编译到执行
Go语言(也称为Golang)自从2009年由Google发布以来,已成为现代软件开发中不可或缺的一部分。设计者Rob Pike, Ken Thompson和Robert Griesemer致力于解决多核处理器、网络系统和大型代码库所引发的现实世界编程问题。我们将深入探讨Go语言在运行和编译方面的核心思考点。原创 2023-11-29 14:22:15 · 494 阅读 · 0 评论 -
Go 谈论了解Go语言
Go语言,自2009年由Google推出以来,凭借其简洁的语法、出色的性能和高度的可移植性,迅速崭露头角。它为并发编程提供了一流的支持,同时拥有丰富而强大的标准库。在云原生、微服务、数据分析等多个前沿领域里,Go已经成为了一种不可或缺的编程工具。它的生态系统日渐完善,拥有大量的开源项目和活跃的社群。综上所述,无论你是希望构建高性能的服务端应用,还是寻求一种高效、可靠的通用编程语言,Go都是一个值得深入学习和使用的选择。原创 2023-11-29 10:54:29 · 432 阅读 · 0 评论 -
Go GORM简介
在GORM中,你可以通过定义Go结构体来创建数据库表。gorm.ModelPrice uint然后,你可以使用。原创 2023-11-28 15:41:05 · 613 阅读 · 0 评论 -
Go 接口:Go中最强大的魔法 接口应用模式或惯例介绍
通过这种垂直组合,我们可以达到方法实现的复用、接口定义重用等目的。在实现层面,Go 语言通过类型嵌入(Type Embedding)实现垂直组合,组合方式主要有以下几种。原创 2023-11-28 10:54:31 · 78 阅读 · 0 评论 -
Go 接口:nil接口为什么不等于nil?
接口的静态特性体现在接口类型变量具有静态类型。比如 var err error中变量 err的静态类型为 error。拥有静态类型,那就意味着编译器会在编译阶段对所有接口类型变量的赋值操作进行类型检查,编译器会检查右值的类型是否实现了该接口方法集合中的所有方法。**而接口的动态特性,就体现在接口类型变量在运行时还存储了右值的真实类型信息,这个右值的真实类型被称为接口类型变量的动态类型。我们可以看到,这个示例通过 errros.New构造了一个错误值,赋值给了 error接口类型变量 err。原创 2023-11-28 10:19:37 · 446 阅读 · 0 评论 -
实现流量控制和熔断降级
在 Sentinel 中,资源是你想要保护的对象,可以是接口、方法、HTTP 路由等。你需要为你的资源定义流量控制规则。假设你要保护一个函数 myFunction// 你的业务逻辑你可以在初始化代码中定义流量控制规则,以控制资源的访问速率。// 定义流量控制规则Count: 100, // 允许的最大 QPSControlBehavior: base.Reject, // 超出限制后的处理行为},})if err!= nil {// 处理规则加载错误panic(err)原创 2023-11-24 14:19:42 · 345 阅读 · 0 评论 -
Go 本地搭建playground
搭建go playground 的步骤。原创 2023-11-24 13:53:23 · 679 阅读 · 0 评论 -
Go lumberjack 日志轮换和管理
在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack,它提供了一个方便的方式来处理日志文件的轮换,以防止日志文件无限增长。本文将详细介绍 github.com/natefinch/lumberjack,包括其主要特点、如何使用它以及示例代码。让我们一起深入了解这个有用的 Go 语言日志记录库。原创 2023-11-23 11:02:32 · 906 阅读 · 1 评论 -
gRPC with JWT
在 gRPC 中使用 JWT(JSON Web Tokens)进行身份验证是一种常见的做法,它可以帮助你确保请求方的身份和权限。原创 2023-11-23 10:54:42 · 225 阅读 · 0 评论 -
Go iota简介
iota是Go语言中的一个预定义标识符,用于创建自增的无类型整数常量。iota在每个常量声明中按顺序递增,但可以通过显式操作进行调整或跳过。通过使用iota,我们可以简化枚举类型和相关常量的定义,避免手动编写递增的值。原创 2023-11-23 10:50:00 · 633 阅读 · 0 评论 -
Go 实现网络代理
使用 Go 语言开发网络代理服务可以通过以下步骤完成。这里,我们将使用 golang.org/x/net/proxy包来创建一个简单的 SOCKS5 代理服务作为示例。原创 2023-11-22 10:11:32 · 843 阅读 · 0 评论 -
Go 异常处理流程
在Go中,runtime包是负责处理Go运行时(runtime)的细节,包括垃圾回收、协程调度等。当出现panic时,runtime包会负责处理这些异常情况。当程序中出现panic异常的传播:当一个函数发生panic时,该函数会立即停止执行,并将panic传播到调用它的函数。这个过程会一直向上传播,直到被捕获或程序终止。栈的展开(Unwinding):在panic发生时,Go运行时会开始展开调用栈(stack unwinding)。原创 2023-11-22 10:08:31 · 635 阅读 · 0 评论 -
Go 字符串处理:fmt.Sprintf与string.Builder的比较
在Go语言中,我们通常会遇到两种主要的方式来处理和操作字符串:使用函数和类型。尽管两者都可以实现字符串的格式化和连接,但它们在性能和用法上有一些关键区别。原创 2023-11-17 13:50:43 · 416 阅读 · 0 评论 -
Go 上下文 context.Context
Go语言中的上下文(Context)是一种用于在 Goroutines 之间传递取消信号、截止时间和其他请求范围值的标准方式。context包提供了Context类型和一些相关的函数,用于在并发程序中有效地传递上下文信息。原创 2023-11-17 13:46:43 · 400 阅读 · 0 评论 -
Go 使用Viper处理Go应用程序的配置
Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式。它还支持环境变量、命令行标志、远程配置系统(如etcd或Consul),并且可以直接监控配置文件的变化。Viper是一个强大的库,可以帮助我们处理Go应用程序的配置。它支持多种配置源,包括配置文件、环境变量、命令行参数等等,使得处理配置变得简单而直观。原创 2023-11-16 09:44:58 · 355 阅读 · 0 评论 -
Go fsnotify简介
fsnotify是一个用Go编写的文件系统通知库。它提供了一种观察文件系统变化的机制,例如文件的创建、修改、删除、重命名和权限修改。它使用特定平台的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。fsnotify然而,需要注意的是,由于不同的操作系统对文件系统通知的支持程度和方式有所不同,所以在使用fsnotify时,要注意不同平台的差异性,并根据实际需求进行适当的调整。原创 2023-11-16 09:40:23 · 392 阅读 · 0 评论 -
Go ZIP压缩文件读写操作
【代码】Go ZIP压缩文件读写操作。原创 2023-11-15 15:29:58 · 406 阅读 · 0 评论 -
Go 理解零值
在 Go 语言中,零值(Zero Value)是指在声明变量但没有显式赋值的情况下,变量会被自动赋予一个默认值。这个默认值取决于变量的类型,不同类型的变量会有不同的零值。零值是 Go 语言中的一个重要概念,因为它确保了变量在声明后具有一个可预测的初始状态,减少了未初始化变量引发的问题。原创 2023-11-15 15:18:44 · 571 阅读 · 0 评论 -
队列(Queue):先进先出(FIFO)的数据结构
队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服务的人。在本篇中,我将详细介绍队列的概念、用途、实现以及如何在编程中使用队列。如有问题的地方请指出!!!原创 2023-11-10 11:37:36 · 1530 阅读 · 0 评论 -
Go 什么是循环依赖
Go 中的循环依赖是指两个或多个包之间相互引用,形成了一个循环依赖关系。这种情况下,包 A 依赖包 B,同时包 B 也依赖包 A,导致两个包之间无法明确地确定编译顺序,从而可能引发编译错误或其他问题。循环依赖是 Go 中需要小心处理的问题,因为它可能导致程序不可编译或产生未定义行为。在这个示例中,包A 依赖包B,同时包B 也依赖包A。这种情况下,如果不采取适当的措施,编译器无法确定包的编译顺序,可能会导致编译错误。原创 2023-11-10 11:34:36 · 256 阅读 · 0 评论 -
Go RabbitMQ简介 使用
RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,因此被广泛用于构建分布式、异步的消息通信系统。在发送和接收消息之前,您需要定义一个队列。如果队列不存在,它将被创建。queueName, // 队列名称false, // 是否持久化false, // 是否自动删除false, // 是否排他false, // 是否阻塞。原创 2023-11-09 11:39:46 · 927 阅读 · 0 评论 -
Go defer简介
defer是 Go 编程语言中的一个关键字,用于在函数执行结束后延迟执行指定的函数调用。defer的使用非常灵活,它通常用于执行一些清理操作、资源释放、日志记录等任务。以下是对deferdefer的语法。原创 2023-11-09 11:30:35 · 331 阅读 · 0 评论 -
Go cobra简介
当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令、标志和参数,如何生成详细的帮助文档,如何支持子命令等等。为了解决这些问题,就可以派上用场。是一个用于构建强大的命令行应用程序的 Go 语言库。它提供了一种简单且直观的方式来定义命令行接口,使开发者能够轻松地创建复杂的命令行工具,包括子命令、标志(flags)、参数、帮助信息和自定义用法。以下是cobra。原创 2023-11-09 11:17:19 · 488 阅读 · 0 评论 -
Go uuid库介绍
在现代软件开发中,全球唯一标识符(UUID)在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符,它能够保证在全球范围内不重复。在Go语言中,我们可以使用第三方库来方便地生成UUID。本文将介绍如何使用这个库来生成不同版本的UUID,以及它的优势和用途。原创 2023-11-07 14:00:30 · 567 阅读 · 0 评论 -
Go 定时任务实现
定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作,以减轻人工操作的负担,提高效率。在计算机编程和应用程序开发中,定时任务是一种常见的编程模式,用于周期性地执行某些操作、处理数据或触发事件。时间间隔:定时任务通常由时间间隔来触发,这是指在两次任务执行之间的时间段。时间间隔可以是固定的,也可以是根据需要调整的。特定时间点:某些任务需要在特定的日期和时间执行,而不是按时间间隔触发。这可以用于计划将来的事件或在特定的日历日期执行任务。周期性任务。原创 2023-11-07 13:48:24 · 771 阅读 · 2 评论 -
Go 多版本管理
那么有没有既不影响我们自己的本地环境,又能兼顾历史项目的办法呢?答案当然是肯定的:有!又或是自己本地使用的是最新版,但公司的项目中使用的go1.14、go1.13甚至是更早的版本。在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的。,go1.18引入了。原创 2023-11-03 13:47:39 · 437 阅读 · 1 评论 -
Go Gin中间件
Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。那如何开发 Gin 的中间件呢?原创 2023-11-03 13:42:57 · 1557 阅读 · 0 评论 -
算法:查找数组中第K大的元素
要查找一个数组中的第 K 大的元素,有很多方法可以实现,其中常用的方法就是使用分治算法或快速选择算法,这两种方法的时间复杂度到时候O(n)。原创 2023-11-02 13:37:58 · 619 阅读 · 1 评论 -
Go 如何实现并发
Go语言的并发机制是其强大和流行的一个关键特性之一。Go使用协程(goroutines)和通道(channels)来实现并发编程,这使得编写高效且可维护的并发代码变得相对容易。原创 2023-11-02 10:25:40 · 298 阅读 · 0 评论 -
Go 内存逃逸
var data []int // 定义一个切片for i := 0;i < 1000;i++ {data = append(data, i) // 修改局部切片在这个示例中,data是一个局部切片,但它在函数返回后被返回,因此它会逃逸到堆上分配内存。原创 2023-11-02 10:03:01 · 482 阅读 · 1 评论 -
Go 语言gin框架的web
节省时间与精力,更高效地打造稳定可靠的Web项目:基于Go语言和Gin框架的完善Web项目骨架。无需从零开始,直接利用这个骨架,快速搭建一个功能齐全、性能优异的Web应用。充分发挥Go语言和Gin框架的优势,轻松处理高并发、大流量的请求。构建可扩展性强、易于维护的代码架构,保证项目的长期稳定运行。同时,通过集成常用功能模块和最佳实践,减少繁琐的开发工作,使您专注于业务逻辑的实现。该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装。原创 2023-10-30 11:37:41 · 253 阅读 · 1 评论 -
Go Map底层实现简述
Go的map是一种高效的数据结构,用于存储键值对。其底层实现是一个哈希表(hash table),下面是有关map。原创 2023-10-30 10:53:55 · 366 阅读 · 0 评论 -
Go 命令大全:全面解析与实践
在这部分,我们将通过一个表格来快速浏览Go语言的所有内建命令及其基本功能。在这一部分,我们将逐一介绍上述表格中的Go命令。我们将探讨每个命令的详细说明、使用场景,以及命令使用后的实际返回案例。命令用于编译Go源文件。命令用于编译并运行Go程序。用于对Go代码进行静态分析,检查可能存在的错误。用于查看Go语言标准库或你的代码库中的文档。用于查看命令或主题的帮助信息。用于打印当前Go的版本信息。用于编译和安装Go程序或库。用于运行Go程序的测试。用于打印Go的环境信息。用于运行指定的Go工具。原创 2023-10-27 10:02:37 · 478 阅读 · 1 评论