Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时,遇到的错误及处理过程(踩坑之旅)!

一、gozstd简介

gozstd是一个针对Zstandard(简称Zstd)的Go语言包装器,它提供了简单且高效的API,使得开发者能够在Go程序中便捷地进行数据压缩和解压操作。

gozstd可用于数据存储和传输、日志处理、实时流处理、云服务等场景。

gozstd 包的具体详情见:https://pkg.go.dev/github.com/valyala/gozstd#section-readme

二、使用方法及报错处理

1、使用方法

在window10系统中,使用 gozstd 包进行数据压缩,方法如下:

  • 下载 gozstd 包
go get -u github.com/valyala/gozstd
  •  引入 gozstd 包
import "github.com/valyala/gozstd"
  •  调用压缩及解压数据的方法
package mainimport ("fmt""log""github.com/valyala/gozstd"
)func main() {data := []byte("hello world")// 压缩数据compressedData := gozstd.Compress(nil, data)// 解压数据decompressedData, err := gozstd.Decompress(nil, compressedData)if err != nil {log.Fatalf("cannot decompress data: %s", err)}fmt.Printf("经过 zstd 压缩及解压后的数据: %s\n", decompressedData)
}

更多用法见:https://pkg.go.dev/github.com/valyala/gozstd#section-readme

2、编译错误处理

在 windows 系统下编译报错:

D:\...\main>go run main.go
# github.com/valyala/gozstd
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:14:48: undefined: DefaultCompressionLevel
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:31:59: undefined: CDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:35:64: undefined: CDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:47:20: undefined: Writer
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:56:22: undefined: NewWriterLevel
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:101:61: undefined: DDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:110:6: undefined: Reader
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:117:8: undefined: NewReader

如下图所示: 

经查,在 gozstd 的官方问题列表中,遇到类似的错误,于是尝试着到gozstd包的路径下重编译libzstd.a

cd ../../go/pkg/mod/github.com/valyala/gozstd && make clean libzstd.a

但编译提示 make[2]: cc: No such file or directory,如图:

经查,发现原因是windows系统中没有安装gcc编译器,于是用 cygwin (之前用cygwin安装了make命令)安装相应版本的gcc,结果可以成功 make clean libzstd.a了,如图:

但问题又来了,真是刚踩完一个坑又遇到另一个坑,这次在编译main.go程序时,提示:

# runtime/cgo
gcc_libinit_windows.c: In function '_cgo_beginthread':
gcc_libinit_windows.c:143:27: error: implicit declaration of function '_beginthread'; did you mean '_cgo_beginthread'? [-Werror=implicit-function-declaration]143 |                 thandle = _beginthread(func, 0, arg);|                           ^~~~~~~~~~~~|                           _cgo_beginthread
cc1: all warnings being treated as errors

于是,又开始漫长的搜索之旅,找到别人之前踩过类似的坑,文章地址为:runtime/cgo: gcc_libinit_windows.c:136:27: error: implicit declaration of function '_beginthread' · Issue #59490 · golang/go · GitHub

有人建议删除其他gcc环境,改用tdm-gcc。

于是抱着试一试的态度,下载并安装 tdm-gcc(tdm-gcc), 参考了文章:Windows最好用的gcc/g++编译器Tmdgcc_tdm-gcc-CSDN博客

安装完tdm-gcc后,编译main.go,成功,如图:

 

分析原因:原来gozstd用了c编写,GO项目引用gozstd包后,编译会用到 c 语言编译器,即gcc,之前估计安装的gcc版本问题,导致各种报错。

最终解决方法:安装 tdm-gcc 编译工具!

注:为了测试这个问题,我专门在虚拟机中的centos7系统下安装了go环境,引入gozstd包,在linux环境下编译,一切正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404340.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blazor开发框架Known-V2.0.8

V2.0.8 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行。目前已有部分客户在使用,最近客户的项目和产品,有的在Docker中运行,有的在重新升级改造…

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景,例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕,实时显示当前城市的天气信息。通过 OpenWeatherMap API,我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…

Python异常处理

Python的异常处理是编程中非常重要的一部分,它允许程序在运行时遇到错误时优雅地处理这些错误,而不是简单地崩溃。异常处理机制包括try、except、else、finally等关键字,它们共同工作以捕获和处理程序中可能出现的错误。 1.异常的基本概念 …

如何有效清理宝塔控制面板中的垃圾文件与优化系统性能

宝塔控制面板(BT-Panel)作为一款流行的服务器管理软件,极大地简化了Linux服务器的管理任务,包括网站部署、数据库管理、文件操作等。然而,随着服务器运行时间的增长,系统中会积累各种临时文件、日志文件、缓…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光:pymodbus的奇妙之旅背景:为何选择pymodbus?pymodbus是什么?如何安装pymodbus?5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试,我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架,并重点关注以下四个方面的内容:运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

深入探索MyBatis的动态代理模式

文章目录 深入探索MyBatis的动态代理模式引言一、 MyBatis动态代理概述动态代理的优势 二、准备工作文件存放结构视图1、Mybatis的主配置文件 mybatis-config.xml2、db.properties文件:3、mybatis-config.xml引用properties文件: 三、MyBatis动态代理的实现原理1. Mapper接口定…

Linux·权限与工具-make

1. Makefile/makefile工具 首先展示一下,makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件,m大小写均可。我们在文件中写入这样两行 wq保存退出后,我们使用 make 命令 可以看到生成了可执行程序&#xff…

人工智能在Facebook的角色:创新与挑战并存

人工智能(AI)已经成为推动科技进步的重要力量,而在社交媒体领域,Facebook则是将AI技术广泛应用的先锋。Facebook通过AI来改善用户体验、提高内容质量以及优化广告投放,极大地提升了平台的功能与价值。然而,…

渗透第三次作业

xss game前八关复现 第一关 传参进入h2标签 传入一个alert(1) 发现没有触发&#xff0c;原因是官方禁用了script 选择用img标签 ?somebody<img src1 οnerrοr"alert(1337)"> 第二关 先把它的双引号闭合掉&#xff0c;再执行1337再闭合 ?jeff111";al…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序&#xff0c;目的都是为了解决最终用户的问题&#xff0c;针对用户界面输入的数据&#xff0c;按照用户期待的逻辑进行处理&#xff0c;得到用户想要的结果。本章将…

Java | Leetcode Java题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) 1);…

【机器学习】(基础篇六) —— 数据集的划分和过拟合问题

数据集的划分 训练集和测试集 在机器学习中&#xff0c;数据集通常会被划分为训练集&#xff08;Training Set&#xff09;和测试集&#xff08;Test Set&#xff09;&#xff0c;有时还会包括一个验证集&#xff08;Validation Set&#xff09;。这样的划分是为了能够更好地…

SQL 数据库设计、事务、视图 <13>

一、数据库设计 1.多表之间的关系 1&#xff09; 一对一&#xff08;了解&#xff09; 如&#xff1a;人和身份证 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人 2&#xff09;一对多&#xff08;多对一&#xff09; 如&#xff1a;部门和员…

Flink消费Kafka数据积压排查解决

0、背景 有个Flink任务每天不定时会出现数据积压&#xff0c;无论是白天还是数据量很少的夜里&#xff0c;且积压的数据量会越来越多&#xff0c;得不到缓解&#xff0c;只能每日在积压告警后重启&#xff0c;重启之后消费能力一点毛病没有&#xff0c;积压迅速缓解&#xff0…

立仪光谱共焦传感器行业应用|薄膜高度差扫描

01&#xff5c;检测需求&#xff1a;扫描薄膜圆圈的高度差 02&#xff5c;检测方式 客户要求扫描薄膜圆圈的高度差&#xff0c;根据观察样品我们选择立仪科技D40A30镜头搭配H系列控制器进行测量 03&#xff5c;光谱共焦测量结果 薄膜圆圈的高度差轮廓 04&#xff5c;光谱共焦…

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶 例程说明源码下载目录工程配置一、SDL2的初始化和退出二、OLED画点和读点三、更新OLDE的GRAM四、清屏和清某区域五、点阵字库六、显示字符串七、显示中文字符八、显示图片九、测试代码十、主函数十一、运行结果 例程说…

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…

8月15日笔记

masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境&#xff1a; gcc -v如果系统中已经安装了 GCC&#xff0c;这个命令将输出 GCC 的版本信息。如果未安装&#xff0c;你会看到类似于 “command not found” 的错误消息。 如果没有下载&#xff0c;使用如下命令…

万维网与HTTP协议:基础知识简明指南

引言 在当今的数字时代&#xff0c;了解万维网&#xff08;World Wide Web, WWW&#xff09;和HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;是至关重要的。本文将为基础小白们简明扼要地介绍万维网及其核心协议HTTP&#xff0c;并通过简单的例子和清晰的段落…