欢迎加入开源鸿蒙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/comGogs 作者封装的Go通用工具合集,集成大量高频工具函数,省去重复手写工具代码,早期Gogs、Xorm配套大量使用。

核心功能分类
  1. 类型转换:任意类型快速转字符串、数字(ToStrStrTo
  2. 字符串工具:URL编解码、HTML转义、下划线命名、数组包含判断
  3. 文件系统:判断文件/文件夹是否存在、遍历目录、写入文件、人性化文件大小
  4. 格式校验:邮箱、URL格式校验
  5. 加解密/编解码:Base64、AES-GCM加密解密
  6. HTTP请求工具:简化GET/POST、JSON请求、下载文件
  7. 日志彩色打印、随机字节生成、数组反转
二、安装依赖
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"
)
  1. package main:声明当前是可执行程序,不是库文件,能编译运行生成二进制。
  2. fmt:Go 标准库,用于控制台打印输出。
  3. 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")

驼峰命名转下划线蛇形命名,开发常用:
UserNameInfouser_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:

  1. com.IsEmail(email):校验邮箱格式,必须包含 @、域名后缀;
  2. 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))

文件判断系列

  1. com.IsExist(path):路径是否存在(不管是文件还是文件夹);
  2. com.IsFile(path):路径存在且是普通文件;
  3. 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)
  1. com.Base64Encode(string):普通字符串转 Base64 编码字符串;
  2. 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 容易误解,实际传入第二个填充字符时,只会生成全相同字符的字节数组;不传填充字符才会生成随机字节。

九、代码整体特点 & 生产环境注意事项

优点

  1. 统一封装常用工具,替代标准库零散的 strconvnet/urlosregexp
  2. API 简单直观,一行代码完成转换、校验、文件判断;
  3. 覆盖 Web 开发高频需求:参数编码、命名转换、内容过滤、格式校验。

生产环境需要优化的点

  1. 所有带 error 返回的函数(StrTo.IntUrlDecodeBase64Decode)示例都用 _ 忽略错误,正式代码必须捕获错误做异常判断;
  2. com.IsUrl 校验规则较简单,复杂业务域名校验建议自定义正则;
  3. StripTags 仅简单去除标签,无法抵御复杂 XSS 攻击,前端内容还需额外安全处理;
  4. 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

参数说明:

  1. 第一个参数:字节数组长度
  2. 第二个参数:填充用的单个 byte 字符
    作用:生成指定长度、统一字符的字节切片,多用于占位测试。

补充:该库其他常用隐藏能力(拓展)

  1. com.MD5 / com.SHA1 字符串哈希加密
  2. com.RandomString(n) 生成随机字符串(验证码、随机密钥)
  3. com.DiffStrings 对比两个字符串切片差异
  4. com.RemoveDuplicateStr 字符串切片去重
  5. 时间辅助函数、IP 校验、中文相关工具

业务使用场景总结

  1. HTTP 接口参数转换:url 参数字符串快速转数字、布尔
  2. 表单校验:邮箱、URL 格式快速判断
  3. 前后端字段转换:驼峰 ↔ 下划线
  4. 文件上传模块:路径存在判断、文件大小格式化展示
  5. 简单加密传输:Base64、MD5 哈希
  6. 白名单、权限判断:切片包含值快速检测
  7. 富文本内容清洗:过滤 HTML 标签防简单 XSS

注意点

  1. com.StrToBase64DecodeUrlDecode 都返回 error,生产环境建议捕获错误,不要下划线忽略
  2. StripTags 仅简单移除标签,不能完全抵御 XSS 攻击,高安全场景需专业 html 转义库
  3. RandomCreateBytes 并非随机字符,只是填充同一个字符;如需随机验证码使用 com.RandomString
五、高频API速查表
类型转换
  • com.ToStr(v):任意类型转string
  • com.StrTo(s).Int() / .Int64() / .Float64():字符串转数字
字符串处理
  • UrlEncode / UrlDecode URL编码解码
  • ToSnakeCase 驼峰转下划线
  • StripTags 清除HTML标签
  • IsSliceContainsStr(slice, str) 判断切片包含字符串
校验工具
  • IsEmail(email) 邮箱校验
  • IsUrl(url) URL格式校验
文件操作
  • IsExist(path) 路径是否存在
  • IsFile(path) 是否文件
  • IsDir(path) 是否文件夹
  • HumaneFileSize(bytes) 字节转 KB/MB/GB 友好文本
编解码
  • Base64Encode / Base64Decode Base64
  • AESGCMEncrypt / AESGCMDecrypt AES-GCM对称加密
HTTP工具(拓展)
// GET请求自动解析JSON
type DemoResp struct {
	Code int `json:"code"`
}
var resp DemoResp
_, err := com.HttpGetJSON(nil, "https://xxx/api", nil, &resp)
六、使用场景
  1. Gin/Golang Web项目:快速参数转换、表单校验、文件上传判断
  2. 脚本工具:批量文件处理、目录遍历、简单加密
  3. ORM配套:数据库字段类型快速转换、参数清洗
  4. 爬虫:URL编解码、HTML内容过滤、接口HTTP请求简化
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐