llvm-gcc-compat补齐cc 编译命令实现鸿蒙PC安装第三方库unknwon/com`,玩转go语言通用工具合集,集成大量高频工具函数
欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloper
AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_go_cgo
本文讲解鸿蒙PC基于musl库、应用沙箱与二进制强制签名机制,不原生支持Go语言,通用Linux编译产物无法直接运行。需借助社区Harmonybrew包管理器搭建开发环境:纯Go开发安装go与ohos-sdk,依托SDK实现编译自动签名;CGO跨语言开发需额外安装llvm-gcc-compat补齐cc 编译命令,编译时手动开启CGO参数。搭配CodeArts IDE可完成全流程开发,同时需提前处理软件冲突、使用原生终端规避环境报错。
可以参考OpenHarmony 鸿蒙 PC + CodeArts IDE 实现 Go开发完整开发环境搭建指南
一、unknwon/com`库是什么 & 作用
unknwon/com 是 Gogs 作者封装的Go通用工具合集,集成大量高频工具函数,省去重复手写工具代码,早期Gogs、Xorm配套大量使用。
核心功能分类
- 类型转换:任意类型快速转字符串、数字(
ToStr、StrTo) - 字符串工具:URL编解码、HTML转义、下划线命名、数组包含判断
- 文件系统:判断文件/文件夹是否存在、遍历目录、写入文件、人性化文件大小
- 格式校验:邮箱、URL格式校验
- 加解密/编解码:Base64、AES-GCM加密解密
- HTTP请求工具:简化GET/POST、JSON请求、下载文件
- 日志彩色打印、随机字节生成、数组反转
二、安装依赖
go env -w GOPROXY=https://goproxy.cn,direct
go mod init com-demo
go get github.com/unknwon/com

三、完整无报错 main.go
覆盖主流常用API,无废弃/不存在函数,直接运行
package main
import (
"fmt"
"github.com/unknwon/com"
)
func main() {
// ========== 1. 通用类型转换 ToStr 任意类型转字符串 ==========
fmt.Println("===== 类型转换 ToStr =====")
fmt.Println("数字转字符串:", com.ToStr(123456))
fmt.Println("浮点数转字符串:", com.ToStr(3.1415))
fmt.Println("布尔转字符串:", com.ToStr(true))
// StrTo 字符串转数字,接收 value + error 双返回值
strNum := com.StrTo("6789")
iVal, _ := strNum.Int()
i64Val, _ := strNum.Int64()
fVal, _ := strNum.Float64()
fmt.Println("字符串转int:", iVal)
fmt.Println("字符串转int64:", i64Val)
fmt.Println("字符串转float64:", fVal)
// ========== 2. 字符串工具类 ==========
fmt.Println("\n===== 字符串工具 =====")
// URL 编解码
urlRaw := "name=张三&age=24"
encode := com.UrlEncode(urlRaw)
fmt.Println("URL编码:", encode)
decode, _ := com.UrlDecode(encode)
fmt.Println("URL解码:", decode)
// 驼峰转下划线
fmt.Println("驼峰转snake:", com.ToSnakeCase("UserNameInfo"))
// HTML标签过滤
htmlStr := "<div>测试内容</div>"
fmt.Println("去除HTML标签:", com.StripTags(htmlStr))
// 数组是否包含指定字符串
strSlice := []string{"apple", "banana", "orange"}
fmt.Println("包含banana:", com.IsSliceContainsStr(strSlice, "banana"))
fmt.Println("包含grape:", com.IsSliceContainsStr(strSlice, "grape"))
// ========== 3. 格式校验:邮箱、URL ==========
fmt.Println("\n===== 格式校验 =====")
fmt.Println("合法邮箱:", com.IsEmail("test@qq.com"))
fmt.Println("非法邮箱:", com.IsEmail("bad-email"))
fmt.Println("合法URL:", com.IsUrl("https://github.com"))
fmt.Println("非法URL:", com.IsUrl("abc.com"))
// ========== 4. 文件系统工具 ==========
fmt.Println("\n===== 文件系统工具 =====")
testPath := "./main.go"
fmt.Println("文件是否存在:", com.IsExist(testPath))
fmt.Println("是否是文件:", com.IsFile(testPath))
fmt.Println("是否是文件夹:", com.IsDir("./"))
// 人性化文件大小展示
fmt.Println("文件大小展示:", com.HumaneFileSize(1048576))
// ========== 5. Base64 编解码 ==========
fmt.Println("\n===== Base64 编解码 =====")
originText := "hello go com package"
b64Str := com.Base64Encode(originText)
fmt.Println("Base64编码:", b64Str)
decodeText, _ := com.Base64Decode(b64Str)
fmt.Println("Base64解码:", decodeText)
// ========== 6. RandomCreateBytes 正确用法:仅填充单个字符 ==========
fmt.Println("\n===== 生成固定填充字节数组 =====")
// 第二个参数为单个byte,生成6个'a'组成的字节数组
randByteArr := com.RandomCreateBytes(6, 'a')
fmt.Println("固定字符填充:", string(randByteArr))
}

四、运行命令
go run main.go
github.com/unknwon/com 是 Go 后端老牌通用工具集,整合类型转换、字符串处理、正则校验、文件操作、Base64、URL编解码、随机字节等高频工具函数,避免重复封装工具方法,CRUD 业务开发非常常用。
一、整体说明
这是一段演示第三方工具库 github.com/unknwon/com 常用工具函数的完整示例代码,com 是一个轻量化 Go 通用工具集,封装了类型转换、字符串处理、格式校验、文件操作、Base64、字节生成等高频通用能力,不用自己重复造轮子。
入口是 main 函数,代码按功能拆成6大模块,下面分段拆解。
二、头部包导入解析
package main
import (
"fmt"
"github.com/unknwon/com"
)
package main:声明当前是可执行程序,不是库文件,能编译运行生成二进制。fmt:Go 标准库,用于控制台打印输出。github.com/unknwon/com:第三方工具库,所有工具方法都通过com.xxx()调用,使用前需要执行go get github.com/unknwon/com下载依赖。
三、模块1:通用类型转换 ToStr / StrTo
代码段
// ========== 1. 通用类型转换 ToStr 任意类型转字符串 ==========
fmt.Println("===== 类型转换 ToStr =====")
fmt.Println("数字转字符串:", com.ToStr(123456))
fmt.Println("浮点数转字符串:", com.ToStr(3.1415))
fmt.Println("布尔转字符串:", com.ToStr(true))
// StrTo 字符串转数字,接收 value + error 双返回值
strNum := com.StrTo("6789")
iVal, _ := strNum.Int()
i64Val, _ := strNum.Int64()
fVal, _ := strNum.Float64()
fmt.Println("字符串转int:", iVal)
fmt.Println("字符串转int64:", i64Val)
fmt.Println("字符串转float64:", fVal)
1. com.ToStr(任意值)
作用:万能转字符串,支持 int、int64、float、bool 等基础类型,不用手动 strconv 转换。
com.ToStr(123456)→"123456"com.ToStr(3.1415)→"3.1415"com.ToStr(true)→"true"
2. com.StrTo("字符串")
返回一个转换器对象,专门把数字字符串转各类数值,链式调用不同方法获取对应类型:
strNum.Int():转 int,返回(int, error),下划线_忽略转换失败的错误;strNum.Int64():转 int64,适合大数字;strNum.Float64():转浮点型;
如果字符串不是合法数字(比如"abc"),第二个返回值 error 会报错,示例中直接丢弃错误,生产环境建议捕获处理。
四、模块2:字符串工具集
// ========== 2. 字符串工具类 ==========
fmt.Println("\n===== 字符串工具 =====")
// URL 编解码
urlRaw := "name=张三&age=24"
encode := com.UrlEncode(urlRaw)
fmt.Println("URL编码:", encode)
decode, _ := com.UrlDecode(encode)
fmt.Println("URL解码:", decode)
// 驼峰转下划线
fmt.Println("驼峰转snake:", com.ToSnakeCase("UserNameInfo"))
// HTML标签过滤
htmlStr := "<div>测试内容</div>"
fmt.Println("去除HTML标签:", com.StripTags(htmlStr))
// 数组是否包含指定字符串
strSlice := []string{"apple", "banana", "orange"}
fmt.Println("包含banana:", com.IsSliceContainsStr(strSlice, "banana"))
fmt.Println("包含grape:", com.IsSliceContainsStr(strSlice, "grape"))
1. UrlEncode / UrlDecode
URL 标准编码解码,处理中文、特殊符号(& =),用于接口请求参数处理:
- 编码后:
name=%E5%BC%A0%E4%B8%89&age=24,浏览器传输中文必须编码; - 解码还原原始字符串,
com.UrlDecode返回(string, error)。
2. com.ToSnakeCase("UserNameInfo")
驼峰命名转下划线蛇形命名,开发常用:UserNameInfo → user_name_info,适配数据库表字段命名规范。
3. com.StripTags(htmlStr)
清除字符串里所有 HTML 标签,只保留纯文本:<div>测试内容</div> → 测试内容,常用于评论、内容防XSS简单过滤。
4. com.IsSliceContainsStr(slice, target)
快速判断字符串切片是否包含目标字符串,返回布尔值:
- 切片有
banana→ true; - 不存在
grape→ false;
不用手写循环遍历数组,简化代码。
五、模块3:格式校验工具(邮箱、URL)
// ========== 3. 格式校验:邮箱、URL ==========
fmt.Println("\n===== 格式校验 =====")
fmt.Println("合法邮箱:", com.IsEmail("test@qq.com"))
fmt.Println("非法邮箱:", com.IsEmail("bad-email"))
fmt.Println("合法URL:", com.IsUrl("https://github.com"))
fmt.Println("非法URL:", com.IsUrl("abc.com"))
内置正则校验函数,直接返回 bool:
com.IsEmail(email):校验邮箱格式,必须包含@、域名后缀;com.IsUrl(url):校验完整合法网址,必须带 http/https 协议头,单纯abc.com会判定非法。
六、模块4:文件系统工具
// ========== 4. 文件系统工具 ==========
fmt.Println("\n===== 文件系统工具 =====")
testPath := "./main.go"
fmt.Println("文件是否存在:", com.IsExist(testPath))
fmt.Println("是否是文件:", com.IsFile(testPath))
fmt.Println("是否是文件夹:", com.IsDir("./"))
// 人性化文件大小展示
fmt.Println("文件大小展示:", com.HumaneFileSize(1048576))
文件判断系列
com.IsExist(path):路径是否存在(不管是文件还是文件夹);com.IsFile(path):路径存在且是普通文件;com.IsDir(path):路径存在且是目录文件夹;
com.HumaneFileSize(size int64)
把字节数转换成人类易读单位:
输入 1048576(1MB),输出 1.00 MB,自动换算 B/KB/MB/GB/TB,不用手动计算单位。
七、模块5:Base64 编解码
// ========== 5. Base64 编解码 ==========
fmt.Println("\n===== Base64 编解码 =====")
originText := "hello go com package"
b64Str := com.Base64Encode(originText)
fmt.Println("Base64编码:", b64Str)
decodeText, _ := com.Base64Decode(b64Str)
fmt.Println("Base64解码:", decodeText)
com.Base64Encode(string):普通字符串转 Base64 编码字符串;com.Base64Decode(b64Str):Base64 还原原始文本,返回(string, error);
常用于简单加密传输、图片/二进制文本存储。
八、模块6:生成固定填充字节数组
// ========== 6. RandomCreateBytes 正确用法:仅填充单个字符 ==========
fmt.Println("\n===== 生成固定填充字节数组 =====")
// 第二个参数为单个byte,生成6个'a'组成的字节数组
randByteArr := com.RandomCreateBytes(6, 'a')
fmt.Println("固定字符填充:", string(randByteArr))
com.RandomCreateBytes(length byte, fillChar byte)
- 第一个参数:字节数组长度,示例
6; - 第二个参数:填充用的单个字节字符
'a';
返回[]byte,转字符串后输出aaaaaa;
补充:这个函数命名带 Random 容易误解,实际传入第二个填充字符时,只会生成全相同字符的字节数组;不传填充字符才会生成随机字节。
九、代码整体特点 & 生产环境注意事项
优点
- 统一封装常用工具,替代标准库零散的
strconv、net/url、os、regexp; - API 简单直观,一行代码完成转换、校验、文件判断;
- 覆盖 Web 开发高频需求:参数编码、命名转换、内容过滤、格式校验。
生产环境需要优化的点
- 所有带 error 返回的函数(
StrTo.Int、UrlDecode、Base64Decode)示例都用_忽略错误,正式代码必须捕获错误做异常判断; com.IsUrl校验规则较简单,复杂业务域名校验建议自定义正则;StripTags仅简单去除标签,无法抵御复杂 XSS 攻击,前端内容还需额外安全处理;unknwon/com库更新停滞,新项目可考虑标准库+轻量替代库,减少第三方依赖。
十、程序运行输出预览
===== 类型转换 ToStr =====
数字转字符串: 123456
浮点数转字符串: 3.1415
布尔转字符串: true
字符串转int: 6789
字符串转int64: 6789
字符串转float64: 6789
===== 字符串工具 =====
URL编码: name=%E5%BC%A0%E4%B8%89&age=24
URL解码: name=张三&age=24
驼峰转snake: user_name_info
去除HTML标签: 测试内容
包含banana: true
包含grape: false
===== 格式校验 =====
合法邮箱: true
非法邮箱: false
合法URL: true
非法URL: false
===== 文件系统工具 =====
文件是否存在: true
是否是文件: true
是否是文件夹: true
文件大小展示: 1.00 MB
===== Base64 编解码 =====
Base64编码: aGVsbG8gZ28gY29tIHBhY2thZ2U=
Base64解码: hello go com package
===== 生成固定填充字节数组 =====
固定字符填充: aaaaaa
1. 安装依赖
go get github.com/unknwon/com
导入包
import (
"fmt"
"github.com/unknwon/com"
)
一、通用类型转换(最核心、使用最多)
1. com.ToStr(v interface{}) 任意类型转字符串
fmt.Println("数字转字符串:", com.ToStr(123456))
fmt.Println("浮点数转字符串:", com.ToStr(3.1415))
fmt.Println("布尔转字符串:", com.ToStr(true))
- 入参
interface{},支持 int/int64/float/bool 等所有基础类型 - 不用手动
strconv拼接,一行快速转文本 - 输出:
"123456"、"3.1415"、"true"
2. com.StrTo(string) 字符串转数字链式对象
strNum := com.StrTo("6789")
iVal, _ := strNum.Int()
i64Val, _ := strNum.Int64()
fVal, _ := strNum.Float64()
StrTo 返回一个转换器对象,提供链式方法:
.Int()→ int.Int64()→ int64.Uint()/.Float64()等
每个方法返回(值, error),转换失败 error 不为空;适合表单、http 参数字符串转数字。
二、字符串工具合集
1. UrlEncode / UrlDecode URL 参数编解码
urlRaw := "name=张三&age=24"
encode := com.UrlEncode(urlRaw)
decode, _ := com.UrlDecode(encode)
- UrlEncode:对中文、特殊符号做 URL 转义,用于拼接 Get 请求参数
输出:name%3D%E5%BC%A0%E4%B8%89%26age%3D24 - UrlDecode:还原编码后的字符串,接口接收参数时解码中文
2. ToSnakeCase 驼峰转下划线 snake_case
com.ToSnakeCase("UserNameInfo") // user_name_info
后端常用:前端小驼峰字段 → 数据库下划线字段,和之前 Rust convert_case 功能一致。
3. StripTags 清除 HTML 标签
htmlStr := "<div>测试内容</div>"
com.StripTags(htmlStr) // "测试内容"
过滤富文本、评论内容,防止 XSS 简单过滤,仅移除 <xxx> 标签。
4. IsSliceContainsStr 判断字符串切片是否包含目标值
strSlice := []string{"apple", "banana", "orange"}
com.IsSliceContainsStr(strSlice, "banana") // true
com.IsSliceContainsStr(strSlice, "grape") // false
替代手写 for 循环判断切片存在性,权限校验、白名单过滤高频使用。
三、格式正则校验
内置正则封装,无需自己写正则表达式:
com.IsEmail("test@qq.com") // true
com.IsEmail("bad-email") // false
com.IsUrl("https://github.com") // true
com.IsUrl("abc.com") // false
IsEmail:校验标准邮箱格式IsUrl:校验带 http/https 合法网址,纯域名abc.com判定非法
四、文件系统工具
1. 文件/目录存在性判断
testPath := "./main.go"
com.IsExist(testPath) // 文件/文件夹是否存在
com.IsFile(testPath) // 是否为普通文件
com.IsDir("./") // 是否为文件夹
业务场景:上传文件前判断路径是否存在、静态资源校验。
2. HumaneFileSize 字节数转人性化大小
com.HumaneFileSize(1048576)
输入字节数,自动换算 KB/MB/GB,示例 1048576 = 1MB,输出友好展示文件大小。
五、Base64 编解码
originText := "hello go com package"
b64Str := com.Base64Encode(originText)
decodeText, _ := com.Base64Decode(b64Str)
Base64Encode:普通文本 → base64 字符串Base64Decode:base64 还原原始文本,返回(string, error)
适用:简单图片编码、加密临时报文传输。
六、RandomCreateBytes 生成固定字符字节数组
randByteArr := com.RandomCreateBytes(6, 'a')
// 输出:aaaaaa
参数说明:
- 第一个参数:字节数组长度
- 第二个参数:填充用的单个 byte 字符
作用:生成指定长度、统一字符的字节切片,多用于占位测试。
补充:该库其他常用隐藏能力(拓展)
com.MD5/com.SHA1字符串哈希加密com.RandomString(n)生成随机字符串(验证码、随机密钥)com.DiffStrings对比两个字符串切片差异com.RemoveDuplicateStr字符串切片去重- 时间辅助函数、IP 校验、中文相关工具
业务使用场景总结
- HTTP 接口参数转换:url 参数字符串快速转数字、布尔
- 表单校验:邮箱、URL 格式快速判断
- 前后端字段转换:驼峰 ↔ 下划线
- 文件上传模块:路径存在判断、文件大小格式化展示
- 简单加密传输:Base64、MD5 哈希
- 白名单、权限判断:切片包含值快速检测
- 富文本内容清洗:过滤 HTML 标签防简单 XSS
注意点
com.StrTo、Base64Decode、UrlDecode都返回 error,生产环境建议捕获错误,不要下划线忽略StripTags仅简单移除标签,不能完全抵御 XSS 攻击,高安全场景需专业 html 转义库RandomCreateBytes并非随机字符,只是填充同一个字符;如需随机验证码使用com.RandomString
五、高频API速查表
类型转换
com.ToStr(v):任意类型转stringcom.StrTo(s).Int()/.Int64()/.Float64():字符串转数字
字符串处理
UrlEncode / UrlDecodeURL编码解码ToSnakeCase驼峰转下划线StripTags清除HTML标签IsSliceContainsStr(slice, str)判断切片包含字符串
校验工具
IsEmail(email)邮箱校验IsUrl(url)URL格式校验
文件操作
IsExist(path)路径是否存在IsFile(path)是否文件IsDir(path)是否文件夹HumaneFileSize(bytes)字节转 KB/MB/GB 友好文本
编解码
Base64Encode / Base64DecodeBase64AESGCMEncrypt / AESGCMDecryptAES-GCM对称加密
HTTP工具(拓展)
// GET请求自动解析JSON
type DemoResp struct {
Code int `json:"code"`
}
var resp DemoResp
_, err := com.HttpGetJSON(nil, "https://xxx/api", nil, &resp)
六、使用场景
- Gin/Golang Web项目:快速参数转换、表单校验、文件上传判断
- 脚本工具:批量文件处理、目录遍历、简单加密
- ORM配套:数据库字段类型快速转换、参数清洗
- 爬虫:URL编解码、HTML内容过滤、接口HTTP请求简化
更多推荐



所有评论(0)