Gobin v1.2.0 已经发布。这是一个向后兼容的功能版本,核心目标很明确:让一个静态博客项目从“能快速构建”,继续往“能长期维护、能放心发布、能顺手部署”推进。
Tag: go
Go 语言以其并发编程能力著称,而 goroutine 是实现这一特性的核心。在日常开发中,我们很容易启动 goroutine,但如果不了解它的生命周期与回收机制,就可能引发性能问题甚至 goroutine 泄漏。
切片是Go语言中最常用的数据结构之一,具有灵活、轻量的特点。本文将介绍切片的定义、底层原理、常用操作、性能优化技巧,并配套示例代码。
在图像处理中,文字渲染是赋予图片信息价值的关键技术。github.com/golang/freetype 作为Go语言中最强大的开源字体渲染库之一,能高效实现文字与图像的完美融合。本文将深入探索其使用技巧、底层原理,并通过实战案例展示其灵活性。
引言:为什么选择 chromedp?
在现代 Web 开发中,浏览器自动化已成为提升效率的关键技术。对于 Go 开发者而言,chromedp 是一个强大的工具,它通过 Chrome DevTools 协议直接控制 Chrome/Chromium 浏览器,无需额外依赖如 Selenium 或 WebDriver。
简介:什么是 gg
gg 是由 Fogleman 开发的一个用 Go 编写的 2D 图形绘制库,灵感来源于 Python 的 Cairo 和 Processing 项目。gg 旨在提供简洁、直观的 API,以实现图像绘制、文本渲染、图形组合等操作,适用于图像处理、数据可视化、图像合成等多种用途。
在对称加密算法中,AES-GCM 和 3DES 是两种综合性能和历史都算有代表性的算法。本文将从安全性、性能、应用场景等综合综吁解析,全面对比这两种对称加密算法。
在日常的 Web 开发中,我们经常使用 HTTP POST 请求来提交表单、上传文件、发送 JSON 数据等。但你是否想过:POST 请求的 body 是不是有大小限制?以及在使用 Gin 框架构建 Web 服务时,这种限制是否存在?
在大多数现代编程语言中(如 Python、JavaScript),我们可以直接在函数定义时为参数设置默认值。但在 Go 中,语言本身并不支持函数参数默认值,所以我们需要通过一些设计模式来实现这一功能。
在 Go (Golang) 中,channel 和 mutex 是两种实现并发控制的常用工具,它们的设计理念和使用场景有明显差异。下面对比两者,并分析适用场景:
在日常的数据处理、日志分析、数据导入场景中,CSV(Comma-Separated Values)作为一种简单而强大的数据格式,被广泛使用。本文将介绍如何使用 Golang 高效地读取 CSV 文件、查询数据,并导入到 MySQL 数据库中。
在实际开发中,我们常常需要根据不同环境(开发、测试、生产)来配置数据库地址、端口号、API 密钥等信息。环境变量(Environment Variables)是最常见、最安全的一种配置方式。
在 Go 开发中,结构体标签(Tag)是一种强大且常被忽视的元数据工具,广泛应用于 JSON 编码、数据库映射、表单校验等场景。本文将从底层原理、反射解析、自定义工具构建,逐步深入理解 Tag 的实际价值,并对比手写解析与专业库的利弊。
在云原生和微服务时代,对象存储已成为存储非结构化数据(如图片、日志、备份等)的首选方案。MinIO 是一款高性能、兼容 S3 API 的开源对象存储服务,而它的官方 Go SDK —— minio-go,则可以让你在 Go 语言项目中轻松集成对象存储功能。
在 Go 生态中,传统的 ORM 往往要么“魔法”过多(如 GORM),要么过于模板化(如 SQLBoiler)。bun 则以 SQL-first 的设计理念,为开发者提供了轻量、高性能且灵活可控的 ORM 和查询构建器。它同时支持 PostgreSQL、MySQL(包括MariaDB)、SQLite、MSSQL、Oracle,并与分布式追踪平台 Uptrace 深度集成,让你在享受 ORM 便捷性的同时,依然对底层 SQL 保有完全掌控权。
引言
在Go语言中,golang.org/x/crypto/ssh 是一个官方维护的第三方库,用于实现 SSH 客户端和服务器功能。本文我们将学习如何使用该库建立 SSH 连接、执行远程命令、模拟终端交互等常见操作。
Go 语言通过 cgo 提供了与 C 代码交互的能力,使得开发者能够在 Go 程序中直接调用 C 语言的函数和库。无论是嵌入 C 代码,还是链接 C 动态库,cgo 都能让 Go 程序与 C 语言代码紧密结合,发挥 C 的高性能和 Go 的便利性。
在本文中,我们将学习如何将 Go 代码编译成 C 动态库,并通过 C 程序调用 Go 动态库中的函数。我们将逐步介绍如何生成 Go 动态库,如何编写 C 程序来调用 Go 函数,以及如何在 C 程序中链接 Go 生成的共享库。
原文在这里。
原文在这里。
Go语言Excel处理库 github.com/xuri/excelize/v2 使用详解
github.com/xuri/excelize/v2 是一个功能强大的 Go 语言库,用于创建、读取、修改和写入 Microsoft Excel (.xlsx) 文件。无论你需要处理简单的表格数据还是复杂的表单、图表和样式,这个库都能为你提供全面的支持。本文将详细介绍如何使用 excelize 库,并通过代码示例演示其常用功能。
github.com/tealeg/xlsx/v3 是一个非常流行的 Go 语言库,用于读取和写入 Microsoft Excel .xlsx 文件。它支持 Excel 2007 及更高版本的文件格式,能够帮助你方便地处理 Excel 文件中的工作表、单元格、行列操作等。
在构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。github.com/AlecAivazis/survey/v2 是一个为 Go 语言设计的库,专门用于构建交互式的命令行界面。它提供了多种用户输入方式,让你的 CLI 工具变得更加易用和友好。
原文在这里。
原文在这里。
bufio.Scanner 是 Go 标准库中的一个类型,用于高效地逐行读取输入,通常用于处理来自文件、标准输入或其他 I/O 源的流式数据。它的主要功能是将输入按行或自定义分隔符进行分割,便于逐行或逐段处理数据。下面是关于 bufio.Scanner 的简单介绍。
前面的几篇文章主要是介绍了一些btc的基础知识,现在我们可以开发自己的btc钱包了。本文是系列文章的第六篇,主要介绍助记词命令,包括创建并保存助记词、导入助记词。
//go:build 是 Go 语言中的一种构建约束(build constraint),用于条件编译。在 Go 1.17 之前,构建约束是通过 // +build 注释实现的,但从 Go 1.17 开始,推荐使用 //go:build 语法,提供了一种更现代化和可读性更强的方式来处理构建条件。
1. 什么是元器?
“腾讯元器”是基于腾讯混元大模型的一站式智能体制作平台,支持通过下述能力对大模型进行增强:
什么是btcd?
btcd 是用 Go 语言(golang)编写的比特币替代性完整节点实现。
BTC(比特币)地址是一个由字母和数字组成的字符串,用于接收和发送比特币。每个地址代表着区块链上一个唯一的标识符,与一对公钥和私钥相关联。比特币地址的生成过程涉及复杂的加密算法,确保其安全性和唯一性。
BIP-38(Bitcoin Improvement Proposal 38)是比特币改进提案之一,旨在对私钥进行加密,以方便安全地存储和传输。通过加密私钥,用户可以使用一个密码对其进行保护。解密加密的私钥需要提供正确的密码,从而增加了私钥的安全性。
比特币(BTC)钱包是一个用于管理比特币私钥、公钥和地址的工具,允许用户安全地发送、接收和存储比特币。比特币钱包不仅是一个简单的应用程序或设备,它是用户与比特币区块链互动的接口,负责管理用户的数字资产和交易权限。
在 Go 语言中,math/rand 和 crypto/rand 都是用于生成随机数的包,但它们的用途和特性有显著的不同。
在 Go 中使用 SQLite3 数据库,最常见的方法是使用 github.com/mattn/go-sqlite3 这个库。下面是如何在 Go 中使用 SQLite3 的一个简单指南。
原文在这里。
P2SH(Pay to Script Hash)地址是比特币中一种功能强大且灵活的地址类型。它允许更复杂的交易脚本,并在比特币网络上广泛使用。下面详细介绍P2SH地址的特点、用途以及优势。
在日常的开发过程中,我们经常需要在终端中输出信息。为了让这些信息更加直观和易读,使用不同的色彩是一种很好的方式。github.com/fatih/color 是一个轻量级且功能强大的Go语言库,可以方便地为终端输出添加颜色和样式。
Go 语言的 strings 包是标准库中的一个重要部分,专门用于操作字符串。它提供了丰富的字符串处理函数,涵盖了查找、比较、替换、分割、拼接、修剪等操作。在 Go 语言中,字符串是不可变的,strings 包提供的函数都不会修改原始字符串,而是返回新的字符串。
Cobra 是 Go 语言中一个流行的库,用于创建命令行应用程序。它提供了一个易于使用的框架,帮助开发者快速构建强大且灵活的 CLI(Command-Line Interface)工具。Cobra 的主要特点包括命令层次结构、命令行标志(flags)和参数处理、自动生成帮助文档等。
Go 语言的标准库 bytes 包提供了一组用于操作字节切片 ([]byte) 的函数。这个包中的函数与 strings 包中的函数非常类似,但它们操作的是字节切片,而不是字符串。字节切片在 Go 语言中是一种非常重要的数据类型,广泛用于处理二进制数据和文本数据。bytes 包提供了很多处理字节切片的工具,包括但不限于查找、比较、切分、连接、替换、转换等操作。
内存膨胀(Memory Bloat)通常指程序在运行过程中占用的内存逐渐增加,最终导致系统性能下降或者程序崩溃的情况。在 Go 中,可以通过以下几种方法来避免或者减少内存膨胀的问题:
如何避免 MySQL 死锁
在使用 MySQL 时,避免死锁是一项重要的任务。死锁通常发生在多个事务相互等待对方持有的锁时,导致无法继续执行。
在 Go 语言中,接口(interface)是一种定义对象行为的类型。接口定义了一组方法的集合,但是不会实现这些方法。任何类型只要实现了接口中定义的所有方法,就被称为实现了该接口。
Merkle 树(Merkle Tree)是一种树状数据结构,通常用于验证大量数据的完整性和一致性,特别是在加密货币和分布式存储系统中广泛应用。它的核心思想是通过将数据分成小块,并使用哈希函数构建出树状结构,以快速验证任意一块数据是否包含在整体中。它最重要的特性是可以通过少量的
在Go语言中,接口类型转换错误 panic: interface conversion: interface {} is float64, not int64 是一个常见的运行时错误,通常发生在试图将接口中存储的值转换为一个不兼容的具体类型时。本文将探讨这种错误的原因、如何识别它以及如何正确地解决它。
btcd 是一个用Go语言(golang)编写的比特币全节点替代实现。btcsuite 是一个Go语言的 btc 库集合,我们可以使用它来构建比特币交易。
比特币地址(Bitcoin Address)是用于接收和发送比特币的唯一标识符,类似于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点:
使用btcd和相关的btcsuite库来构建比特币交易涉及多个步骤,包括生成密钥对、创建锁定和解锁脚本、构建和签名交易、以及广播交易。
在Go编程语言中,内存管理是一个关键的概念,尤其是在处理高性能或长时间运行的应用程序时。理解内存泄漏和内存逃逸对编写高效、健壮的Go代码非常重要。以下是对Go中的内存泄漏和内存逃逸的详细介绍:
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。遍历二叉树是一种访问所有节点的过程,主要有三种遍历方式:前序遍历、中序遍历和后序遍历。
在Go语言的标准库中,container/list包提供了一个双向链表的实现,这对于需要频繁插入和删除操作的场景非常有用。双向链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和两个指针,分别指向前一个节点和后一个节点。下面我们将详细介绍如何使用container/list包,以及它的内部实现和常见操作。
在 btcd 中,区块结构由区块头(Block Header)和交易列表(Transaction List)组成。区块头包含了一些元数据,而交易列表包含了区块中的所有交易。
概述
为了维护点对点的比特币网络,需要有一个地址来源以便在节点进出时进行连接。比特币协议提供了 getaddr 和 addr 消息,允许节点之间相互传递已知的地址。然而,需要有一个机制来存储这些结果并从中选择节点。同样重要的是,远程节点不能被信任来发送有效的节点,也不能保证不会试图出于恶意目的仅向你提供他们控制的节点。
在比特币和 btcd 中,交易(Transaction)是区块链的基本构建块。每个交易由输入(Inputs)和输出(Outputs)组成。输入引用之前的输出,并提供解锁这些输出的条件。输出包含接收比特币的地址和金额。
1. 简述
PKCS#12 (Public Key Cryptography Standards #12) 是由RSA实验室定义的一种标准,用于将私钥和公钥证书封装到一个加密的文件中。它通常用于在不同系统或应用之间安全地传输私钥和证书,并支持证书链的存储。PKCS12文件的扩展名通常为 .p12 或 .pfx 。
工作量证明(Proof of Work,简称 PoW)是一种用于分布式网络中达成共识的算法。它最早由 Cynthia Dwork 和 Moni Naor 于1993年提出,并由 Satoshi Nakamoto 在比特币白皮书中应用到区块链技术中。在区块链网络里,PoW 用于确保区块链网络的安全性和数据一致性。
1. btcd网络部署
btcd 提供了一个轻量级且高效的比特币全节点实现。这里以docker方式部署 btcd 网络,docker-compose.yml 文件如下:
在Go中,我们可以使用反射(reflection)来实现一个泛型函数,将任何输入转换为字符串。反射允许我们检查和操作运行时的类型信息,从而使我们能够处理任意类型的输入。
Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。
github.com/stretchr/testify 是一个流行的Go语言测试库,它提供了一组丰富的工具和断言函数,使得编写和运行测试变得更加简洁和高效。testify 包含多个子包,每个子包都有特定的功能,例如断言、要求、模拟等。本文将详细介绍 testify 库的使用,包括安装、各个子包的功能和用法等。
在Go语言中,单元测试是确保代码质量和功能正确性的重要手段。Go语言内置了强大的测试框架,使得编写和运行单元测试变得非常简单。本文将详细介绍如何在Go中进行单元测试,包括测试文件的命名、测试函数的编写、常用的测试工具和技巧等。
在Go语言中实现队列可以通过多种方式,最简单和直观的方法是使用切片(Slice)。队列是一种先进先出(FIFO)的数据结构,主要操作包括入队(Enqueue)和出队(Dequeue)。
GMP模型概述
GMP模型是Go语言的并发调度模型,它是由Goroutine、M(OS线程)和P(处理器)三个主要组件构成的。这个模型是Go运行时(runtime)用来调度Goroutines执行的机制,它允许数以万计的Goroutines能够在有限数量的线程上高效运行。下面是GMP模型各个组件的详细说明:
原文在这里。
在 Go 语言中,下划线 _ 是一个特殊的标识符,被称为 "空白标识符" 或 "匿名变量"。它有几个常见的用途:
原文在这里。
什么是WebSocket?
WebSocket是一种网络通信协议,它提供了一种在单个长连接上进行全双工通讯的方式。与传统的HTTP请求只能由客户端发起并由服务器响应不同,WebSocket允许服务器主动向客户端发送消息,实现了真正的双向交互。这一协议在2009年被提出,并随后成为国际标准。
1. 什么是UDP?
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,属于OSI参考模型的一部分。它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP协议使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
分解质因数是将一个正整数分解为若干个质数的乘积的过程。每个质数都是一个素数,即只能被1和自身整除的数。
原文在这里。
原文在这里。
原文在这里。
原文在这里。
const + iota
在 Go 语言中,并没有直接的枚举类型(像其他语言中的枚举一样)。不过,我们可以使用一种常见的约定来模拟枚举,使用const和iota的方法是 Go 中实现枚举类型的一种常见做法,这样可以实现类似枚举的效果。以下是一个简单的示例:
以下是 Go 语言中的一些常见数据类型的详细介绍,以 Markdown 格式输出:
以下是 Go 语言中的一些关键字:
在 Go 语言中,方法可以使用值接收者(value receiver)或指针接收者(pointer receiver)。这两者之间有关键的区别,主要涉及到方法对实例的修改、复制开销和调用时的语法。
函数与方法的区别
在Go语言中,函数(Function)和方法(Method)是两个相关但又有区别的概念,主要涉及到它们的定义和调用方式。
为什么是无序的?
首先,我们先看下go的runtime中是如何实现map的迭代,以go 1.21.6为例,以下是关键部分,完整的源码位于src/runtime/map.go中:
原文在这里。
在 Go 中,两个结构体(struct)可以进行比较的条件是它们的字段类型都是可比较的。可比较的类型包括基本数据类型(如整数、浮点数、字符串等)以及指针、数组、结构体等,只要它们的元素或字段类型也是可比较的。
Go语言中的goroutine是一种轻量级的线程,其优点在于占用资源少、切换成本低,能够高效地实现并发操作。但如何对这些并发的goroutine进行控制呢?
读操作
对已关闭的channel进行读操作时:
原文在这里。
在 Go 语言标准库中,archive 包提供了用于处理归档文件(压缩文件和文件集合)的库。本文将详细介绍 archive/tar 和 archive/zip 包,它们分别用于处理 tar 格式和 zip 格式的归档文件。
对于已上线的 Go 服务,进行调试通常需要在代码中添加调试信息或者利用已有的日志系统。由于直接使用调试器可能会影响服务的性能或者稳定性,因此需要采用一些谨慎的方法。
当我们处理大量数据时,常常需要在其中找到最大或最小值,或者按照一定的优先级顺序处理。这时候,堆就成为一种非常重要的数据结构。堆可以高效地找到最大或最小值,并支持快速的插入和删除操作。
原文在这里。
1. GORM 配置连接超时
1.1 配置连接超时
在建立数据库连接时,你可以设置连接超时。这可以在GORM的初始化过程中完成。以下是一个示例:
在 Go 中,字符串(string)是一种不可变的数据类型,用于表示文本数据。以下是关于 Go 中字符串的一些重要特性和底层实现:
Token 简介
在应用开发中,使用令牌(Token)是一种常见的身份验证和授权机制。以下是一些使用令牌的主要原因:
在 Go 语言中,类型断言是一种用于检查接口值底层类型的机制。类型断言的语法形式是:
bufio 包是 Go 语言标准库中的一个包,提供了带缓冲的 I/O 操作,用于提高读写性能。主要的类型包括 Reader、Writer 和 Scanner。
在 Go 语言中,主要的条件控制语句有 if-else、switch 和 select。以下是对它们的简单介绍:
1. 获取本地IP地址
使用 net 包可以获取本地机器的 IP 地址。以下是一个获取本地 IP 地址的简单示例:
html/template 包是 Go 语言标准库中用于 HTML 模板渲染的包。它提供了一种安全的方式来渲染 HTML 内容,防止一些常见的 Web 攻击,如注入恶意脚本。以下是对 html/template 包的简单介绍:
sync.WaitGroup 是 Go 语言标准库 sync 包提供的一个同步工具,用于等待一组协程完成执行。它通常用于确保所有协程完成后再继续执行后续的代码。WaitGroup 提供了三个主要方法:Add、Done、和 Wait。
在 Go 语言中,处理 HTTP 请求中的表单数据是一项常见任务。github.com/go-playground/form/v4 是一个强大而灵活的库,用于轻松地在 Go 语言中处理表单数据。本文将介绍该库的基本用法,并提供一个简单的示例。
在Go语言中,变量的声明和初始化可以通过多种方式进行。下面是几种常见的方式:
使用 Go 语言开发网络代理服务可以通过以下步骤完成。这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例。
在 Go 语言中,panic、recover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。
Go语言中的上下文(Context)是一种用于在 Goroutines 之间传递取消信号、截止时间和其他请求范围值的标准方式。context 包提供了 Context 类型和一些相关的函数,用于在并发程序中有效地传递上下文信息。
原文在这里。
channel 使用
Go 语言中的通道(Channel)是一种用于在不同 Goroutines 之间进行通信和同步的强大机制。通道允许 Goroutines 之间安全地发送和接收数据,以实现并发程序的协同工作。下面是关于 Go 语言中通道的详细介绍:
在 Go 语言中,零值(Zero Value)是指在声明变量但没有显式赋值的情况下,变量会被自动赋予一个默认值。这个默认值取决于变量的类型,不同类型的变量会有不同的零值。零值是 Go 语言中的一个重要概念,因为它确保了变量在声明后具有一个可预测的初始状态,减少了未初始化变量引发的问题。
对于 Go 语言开发者来说,nil 是一个常见而重要的概念,它表示无效或空的值。在 Go 中,nil 在不同数据结构和上下文中有着不同的含义和用法,涵盖指针、切片、映射、通道和函数。
在Go语言中,我们通常会遇到两种主要的方式来处理和操作字符串:使用fmt.Sprintf函数和string.Builder类型。尽管两者都可以实现字符串的格式化和连接,但它们在性能和用法上有一些关键区别。
什么是循环依赖
Go 中的循环依赖是指两个或多个包之间相互引用,形成了一个循环依赖关系。这种情况下,包 A 依赖包 B,同时包 B 也依赖包 A,导致两个包之间无法明确地确定编译顺序,从而可能引发编译错误或其他问题。循环依赖是 Go 中需要小心处理的问题,因为它可能导致程序不可编译或产生未定义行为。
树(Tree)是一种层次化的数据结构,它在计算机科学中起到了关键的作用。树的结构类似于现实生活中的树,具有根节点、分支节点和叶子节点。树在数据存储、搜索和组织方面具有广泛的应用,如文件系统、数据库索引、编译器等。
定时任务简介
定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作,以减轻人工操作的负担,提高效率。在计算机编程和应用程序开发中,定时任务是一种常见的编程模式,用于周期性地执行某些操作、处理数据或触发事件。
队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服务的人。
栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问。栈遵循后进先出(Last In, First Out,LIFO)原则,即最后放入栈的元素首先被取出。这种数据结构模拟了物理世界中的栈,如一堆书或一摞盘子。
1. 简介
链表(Linked List)是一种基本的数据结构,用于表示一组元素,这些元素按顺序排列,每个元素都与下一个元素连接。与数组不同,链表的元素不是在内存中连续存储的,而是通过指针来连接的。链表由节点(Node)组成,每个节点包含两个主要部分:数据和指向下一个节点(或上一个节点,如果是双向链表)的引用(指针)。链表可以分为单向链表、双向链表和循环链表等不同类型。
在Go编程语言中处理数据时,经常会遇到数组和切片。这两者是不同的数据结构,有各自的特性和用途。本文将对Go中的数组和切片进行比较,以帮助大家更好地理解它们。
数组简介
数组是一种基本的数据结构,它是一组有序的元素的集合,这些元素可以是相同类型的。数组中的每个元素都有一个唯一的索引,通常从0开始,用于访问元素。数组在内存中占据一段连续的空间,因此可以通过索引迅速访问元素。以下是有关数组的详细介绍:
内存逃逸(memory escape)是指在编写 Go 代码时,某些变量或数据的生命周期超出了其原始作用域的情况。当变量逃逸到函数外部或持续存在于堆上时,会导致内存分配的开销,从而对程序的性能产生负面影响。Go 编译器会进行逃逸分析,以确定哪些变量需要在堆上分配内存。下面将详细分析 Go 语言中的内存逃逸以及如何进行优化。
链表分组逆序是一个常见的操作,用于将链表按照一定规则分组后,逆序每个分组。这种操作常常用于解决链表中的某些问题。下面介绍几种常见的用于链表分组逆序的算法,并分析它们的优劣势:
要查找一个数组中的第 K 大元素,有多种方法可以实现,其中常用的方法是使用分治算法或快速选择算法,这两种方法的时间复杂度到时候O(n)。
RA 功能简介
在公共密钥基础设施(PKI)中,CA(Certificate Authority,证书颁发机构)系统的RA(Registration Authority,注册机构)是PKI体系结构的重要组成部分。RA在CA系统中扮演着关键角色,负责处理用户的身份验证和注册请求,然后将这些请求传递给CA进行证书颁发。以下是关于RA的详细介绍:
在 Go 语言中,虽然没有经典的面向对象编程中的继承和多态的概念,但你可以通过接口(interface)来实现多态性。Go 语言鼓励组合和接口多态,这使得代码更加灵活和模块化。下面将详细介绍 Go 语言中如何实现多态。
CSR,全称Certificate Signing Request(证书签发请求),是一种包含了公钥和与主题(通常是实体的信息,如个人或组织)相关的其他信息的数据结构。CSR通常用于向证书颁发机构(Certificate Authority,CA)申请数字证书。下面是CSR的详细介绍:
1. x.509 简介
X.509是一种公共密钥基础设施(PKI)标准,用于证书的格式、结构和管理。X.509证书是用于数字身份验证、数据加密和数字签名的关键组件。以下是X.509证书的详细介绍:
简介
Go语言中的切片(slice)是一种灵活的数据结构,它构建在数组之上并提供了方便的方式来操作数组的一部分。切片的底层实现涉及到数组和一些元数据。以下是Golang切片的底层实现的详细介绍:
在Go编程中,make 和 new 是两个常用的内置函数,用于创建和初始化不同类型的数据结构。下面将简单介绍这两个函数以及它们的用法。
Go的map是一种高效的数据结构,用于存储键值对。其底层实现是一个哈希表(hash table),下面是有关map底层实现的详细介绍:
在 Go 语言开发中,读取和解析配置文件是一个常见的任务。INI 格式是一种简单而常见的配置文件格式,它由多个部分组成,每个部分包含键值对,用于配置应用程序的各种属性。本文将介绍如何在 Go 语言中使用 INI 格式的配置文件。
Go的GPM模型(Goroutine, P, M)是一种用于管理并发执行的调度模型,有助于充分利用多核处理器,并提供高效的并发编程体验。以下是对GPM模型的详细介绍:
思考
开始之前,先考虑下下面的代码的执行结果:
原文在这里。
原文在这里。
Go 1.21中新增的 slices包中提供了很多与切片相关的函数,适用于任意类型的切片。
工厂模式是一种创建型设计模式,它提供了一个用于创建对象的接口,但允许子类决定实例化哪个类。工厂方法让一个类的实例化延迟到其子类。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令、标志和参数,如何生成详细的帮助文档,如何支持子命令等等。为了解决这些问题,github.com/spf13/cobra 就可以派上用场。
在Go语言中,占位符通常是指在字符串中使用特定格式的占位符,用于在运行时将实际值填充到字符串中。这通常用于格式化字符串输出或构建包含变量的字符串。
原文在这里。
Go 1.21中新增的 maps包中定义了一系列非常有用的函数,用于处理任意类型的 map。
Go语言的并发机制是其强大和流行的一个关键特性之一。Go使用协程(goroutines)和通道(channels)来实现并发编程,这使得编写高效且可维护的并发代码变得相对容易。下面是Go的并发机制的详细介绍:
Merkle 树(Merkle Tree)是一种树状数据结构,通常用于验证大规模数据集的完整性和一致性。它的名字来源于其发明者 Ralph Merkle。Merkle 树在密码学、分布式系统和区块链等领域得到广泛应用,尤其在区块链中,它用于验证交易和区块的完整性,确保数据不被篡改。
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换。在 Go 语言中,你可以使用 gopkg.in/yaml.v3 包来解析和生成 YAML 数据。本文将介绍如何使用 gopkg.in/yaml.v3 来处理 YAML 数据。
在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。
单例模式简介
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问点,以便在需要时获取该实例。
max 函数
// The max built-in function returns the largest value of a fixed number of
// arguments of [cmp.Ordered] types. There must be at least one argument.
// If T is a floating-point type and any of the arguments are NaNs,
// max will return NaN.
func max[T cmp.Ordered](x T, y ...T) T
内置函数 max 返回固定数量的 [cmp.Ordered] 类型参数中的最大值。该接口要求至少提供有一个参数。如果 T 是浮点类型,或有任意一个参数是 NaN,那max 将返回 NaN。
GC策略
垃圾回收是一种自动管理内存的技术,它负责识别和释放不再被程序引用的内存对象。在没有垃圾回收的语言中,程序员必须手动分配和释放内存,这经常导致内存泄漏和其他内存相关的错误。Go 语言的垃圾回收器自动识别和释放不再被程序引用的内存对象,使程序员能够专注于编写代码,而不必担心内存管理问题。
原文在这里。
blackfriday 简介
github.com/russross/blackfriday/v2 是一个用Go语言编写的库,用于处理 Markdown 文本。它提供了一种方式将 Markdown 文本转换为 HTML ,或者其他格式,如纯文本或RTF。
RabbitMQ简介
RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,因此被广泛用于构建分布式、异步的消息通信系统。
Sentinel
Sentinel 是阿里巴巴开源的一款高可用性和流量控制的分布式系统。它最初是为了解决阿里巴巴内部的微服务架构中的流量控制和熔断降级问题而开发的。Sentinel 旨在提供实时的流量控制、熔断降级、系统负载保护等功能,以保障应用的高可用性和稳定性。以下是 Sentinel 的详细介绍:
什么是 Prometheus
Prometheus 是一个开源的系统监控和警报工具,最初由 SoundCloud 开发,并于 2012 年发布为开源项目。它是一个非常强大和灵活的工具,用于监控应用程序和系统的性能,并根据预定义的规则触发警报。以下是对 Prometheus 的详细介绍:
原文在这里。
在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack,它提供了一个方便的方式来处理日志文件的轮换,以防止日志文件无限增长。
原文在这里。
表象:Return schema invalid. required items must be unique [recovered]
虽然 Fabric v2.2 已经发布了很久了,但之前因为项目历史问题,一直使用的都是 Fabric v1.4.8,所以智能合约也一直使用的都是 github.com/hyperledger/fabric/core/chaincode/shim 包。
原文在这里。
原文在这里。
标准库 cmp
原文在这里
命令行界面(CLI)工具在现代软件开发中扮演着重要的角色。它们为用户提供了一种交互方式,让他们可以通过命令来操作程序。Go 语言是一个适合开发 CLI 工具的强大编程语言,它提供了丰富的标准库和简单的构建方式。在本文中,我们将介绍使用 Go 开发 CLI 工具的基础知识和最佳实践。
github.com/pkg/errors 和 Go 标准库的 errors 包都用于处理错误,但它们在错误处理的方式和功能上有一些区别。下面是对它们的详细比较:
pprof简介
pprof是Go语言的一个性能分析库,它可以帮助开发者找出程序中的性能瓶颈。pprof提供了CPU分析、内存分析、阻塞分析等多种性能分析功能。
go embed 是 Go 1.16 中引入的特性,它允许将文件嵌入到 Go 代码中,以便在运行时访问这些文件。这对于将静态资源(如 HTML、CSS、JavaScript 文件)直接嵌入到 Go 二进制文件中,以及简化文件分发和部署非常有用。下面是关于 go embed 的详细介绍:
在 GORM 中使用外键涉及到在结构体定义中指定外键关系以及数据库迁移时的操作。下面是一个使用 GORM 定义外键的示例:
本文是区块链浏览器系列的第五篇,项目完整代码在这里。
原文在这里。
在 gRPC 中使用 JWT(JSON Web Tokens)进行身份验证是一种常见的做法,它可以帮助你确保请求方的身份和权限。下面是一种使用 gRPC 和 JWT 进行身份验证的步骤:
在 gRPC 中,可以使用 TLS/SSL 或 Token 认证来进行身份验证。以下是如何实现这两种认证方式的示例:
fsnotify是一个用Go编写的文件系统通知库。它提供了一种观察文件系统变化的机制,例如文件的创建、修改、删除、重命名和权限修改。它使用特定平台的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。
faker 是一个用于生成随机测试数据的 Go 语言库。它能够帮助开发者快速生成模拟数据,用于测试、演示、样本数据生成等场景。
github.com/spf13/cast 和 strconv 都是 Go 语言中用于类型转换的工具库,但它们在功能和使用方式上有一些不同。
gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险。以下是关于 gosec 的详细介绍:
本文是区块链浏览器系列的第四篇。
原文在这里。
原文在这里。
google.golang.org/protobuf/encoding/protojson 是 Go 语言中的一个库,用于处理 Protocol Buffers(protobuf)和 JSON 之间的转换,遵循https://protobuf.dev/programming-guides/proto3#json实现。
Memcache 是一个高性能、分布式的内存缓存系统,常用于缓存数据库查询结果、API调用结果、页面内容等,以提升应用程序的性能和响应速度。下面详细介绍一些 Memcache 的特点和使用方式:
GORM, XORM, ent 和 sqlx 都是 Go 语言的库,用于操作数据库:
ent 是一个由 Facebook 开发的 Go 语言的实体框架,用于构建和维护数据模型。它提供了一种简单的方式来定义、交互和查询数据。
xorm 是一个功能强大的 Go 语言 ORM(对象关系映射)库,提供了许多特点和功能,使得与关系型数据库的交互更加便捷、高效。以下是 xorm 的一些主要特点:
sqlx 是一个用于增强 Go 语言标准库中 database/sql 包的第三方库,它提供了一些额外的功能和工具,使得与数据库交互更加方便和灵活。以下是详细介绍如何在 Go 中使用 sqlx 进行数据库操作的步骤:
本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析。
sonic是一个由字节跳动开发并开源的 JSON 解析库,由 JIT (即时编译)和 SIMD (单指令流多数据流)来加速序列化/反序列化。
Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。
原文来自这里。
原文在这里。
Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:
GORM(Go Object-Relational Mapping)是一个用于Go语言的ORM库,它提供了一种简单、优雅的方式来操作数据库。GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite和SQL Server。以下是GORM的一些主要特性:
安装库
首先,我们需要安装go-redis库。在你的终端中运行以下命令:
在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件。以下是一个简单的示例,展示了如何在gRPC中实现文件传输。
FreeCache 是一个用于 Go 语言的内存缓存库,旨在提供高性能的缓存解决方案。它可以在应用程序内存中存储键值对,用于加速访问频繁的数据,如数据库查询结果、计算结果等。以下是 FreeCache 的一些特点和使用方法的详细介绍:
BigCache 是 Go 语言中的一个高性能内存缓存库,专注于提供快速、高吞吐量的缓存解决方案。与许多其他缓存库不同,BigCache 设计用于减少内存分配和垃圾回收的开销,从而在处理大量数据时提供出色的性能。以下是 BigCache 的一些特点和使用方法的详细介绍:
原文在这里
当构建Web应用程序时,可能需要在不同域之间进行数据交换,这就涉及到跨域资源共享(CORS)。在Gin框架中实现跨域是一个常见的需求。
ETCD简介
ETCD 是一个开源的、高可用的键值存储系统,它被广泛用于配置管理和服务发现。ETCD 使用 Raft 算法来保证数据的强一致性和高可用性。它是 Kubernetes 集群的核心组件之一,用于存储集群配置和状态信息。
在 Gin 框架中,默认情况下并不包含原生的 session 功能。但是,你可以通过使用第三方库 github.com/gin-contrib/sessions 来实现在 Gin 中使用 session。
什么是Gin框架?
Gin是一个用Go语言编写的Web框架,它旨在提供高性能、轻量级的解决方案。Gin基于Radix树和httprouter来实现快速的路由匹配,并且利用Go语言的高并发特性,使其成为处理高并发请求的理想选择。Gin框架提供了简单而灵活的API,使得构建Web应用变得更加简单和高效。
github.com/hyperledger/fabric-config/protolator 是 Hyperledger Fabric 中的一个 Go 包,用于将 Protocol Buffers(ProtoBuf)消息和 JSON 格式之间进行转换。它提供了一种方便的方式来将 Fabric 配置文件(以 ProtoBuf 格式表示)与 JSON 配置文件之间进行相互转换。这对于 Fabric 的配置管理和部署非常有用,使得用户可以轻松地在不同的配置格式之间进行切换。
Wire是一个适用于Go语言的依赖注入(DI)框架,它旨在简化和改进Go应用程序中的依赖管理。它使用代码生成来自动创建依赖项,并通过简单的DSL(领域特定语言)来描述依赖项之间的关系。通过使用Wire,你可以减少手动编写依赖注入代码的工作量,并提高代码的可维护性和可测试性。
原文在这里
原文在这里
简介:
在现代软件开发中,全球唯一标识符(UUID)在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符,它能够保证在全球范围内不重复。在Go语言中,我们可以使用第三方库github.com/google/uuid来方便地生成UUID。本文将介绍如何使用这个库来生成不同版本的UUID,以及它的优势和用途。
最近在研究kratos的使用,发现在kratos run之前会先运行go generate ./...命令。
当声明枚举类型或定义一组相关常量时,Go语言中的iota关键字可以帮助我们简化代码并自动生成递增的值。本文档将详细介绍iota的用法和行为。
Go语音中格式化时间不是常见的y-m-d H:M:S,而是使用2006-01-02 15:04:05 -0700 MST,也就是常说的123456。
当在Linux系统中执行操作时,进程可以通过发送和接收信号与其他进程进行通信。信号是用于通知进程发生特定事件或请求进程采取特定动作的软件中断。
原文在这里。
文中所涉及到的代码运行结果均是在64位机器上执行得到的.
项目中有时候需要访问https网站,但如果该网站使用的是自建证书,那client端验证server端证书时,有时候会报错:
在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的embed,go1.18引入了泛型;又或是自己本地使用的是最新版,但公司的项目中使用的go1.14、go1.13甚至是更早的版本。
时隔20天,OpenAI从v0.0.1升级到了v0.2.0。与v0.0.1版相比,v0.2.0版主要做了以下改动:
1. 简介
在go中,slice是一种动态数组类型,其底层实现中使用了数组。slice有以下特点:
在微信公众号的使用过程中,为了提高信息传输的安全性,可以在服务器配置中将消息加解密模式指定为安全模式。
chatGPT正式发布已经有段时间了,这段时间我也深度体验了chatGPT的魅力。
1. gRPC简介
gRPC是一种高性能、开源和通用的远程过程调用(RPC)框架,由Google开源并维护。它使用Protocol Buffers(protobuf)作为接口定义语言(IDL),提供跨平台、跨语言的RPC调用支持。gRPC具有以下几个特点:
1. 主键问题
在使用gorm访问mysql数据库时,所访问的数据库表是由sql创建的,在go的结构体tag中并未使用gorm,使用Save更新数据时报错,错误描述为where条件不存在,查阅官方文档发现这种情况下需要在结构体中指明库表的主键。
本文是区块链浏览器系列的第二篇。
range的坑
使用range对值类型的切片进行如下操作时,
简介
zap是有uber开发的一款日志库。
Logger
Gorm提供了一个默认的logger实现,默认情况下日志数据级别为warn,同时输出慢SQL:
官方文档在这里。
内容来自微信官方文档。
gin是一个使用Go语言开发的Web框架,具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,支持中间件等。
最近接手的项目中要新增一个抽奖功能,场景类似年会上的抽奖,触发抽奖的只有一个动作,不存在多线程操作导致所抽奖品已经被抽完的情况。简单来说,就是不存在需要锁的场景,也不存在数据同步的情况。
本文主要是记录我搭建go playground的步骤。
以下内容来自官方文档。
github.com/imroc/req 是一个基于 net/http 封装的 Go HTTP 客户端库,旨在简化 HTTP 请求的书写和处理。而 Go 原生的 http.Client 是标准库提供的功能强大但较底层的 HTTP 客户端。