欢迎加入开源鸿蒙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开发完整开发环境搭建指南


一、strcase 库介绍

1. 作用

github.com/iancoleman/strcase 是 Go 语言专业字符串大小写格式转换工具库,专门处理各类命名风格互相转换,开发中常用于:

  1. 数据库蛇形字段 ↔ Go 结构体驼峰字段转换(ORM 映射高频场景)
  2. 变量、常量、接口命名格式统一转换
  3. 批量格式化命名字符串,支持 6 种主流命名格式:
    • 小驼峰 camelCase
    • 大驼峰 PascalCase
    • 下划线蛇形 snake_case
    • 大写下划线 SNAKE_CASE
    • 短横线 kebab-case
    • 短横线大写 KEBAB-CASE

2. 安装命令

go get github.com/iancoleman/strcase

请添加图片描述

二、完整可运行无报错示例代码

新建 main.go,直接复制执行,无需额外配置:

package main

import (
	"fmt"
	"strings"
	"github.com/iancoleman/strcase"
)

// 兼容低版本strcase,手动实现大驼峰 PascalCase
func toPascal(s string) string {
	camel := strcase.ToCamel(s)
	if camel == "" {
		return ""
	}
	// 首字母转大写
	return strings.ToUpper(camel[:1]) + camel[1:]
}

func main() {
	originStr := "UserInfoUserId"
	fmt.Println("原始字符串:", originStr)

	// 1. 小写蛇形(数据库字段)
	snake := strcase.ToSnake(originStr)
	fmt.Println("小写蛇形 snake_case:", snake)

	// 2. 大写蛇形(常量)
	screamingSnake := strcase.ToScreamingSnake(originStr)
	fmt.Println("大写蛇形 SNAKE_CASE:", screamingSnake)

	// 3. 小驼峰 camelCase(变量)
	camel := strcase.ToCamel(snake)
	fmt.Println("小驼峰 camelCase:", camel)

	// 4. 手动兼容实现大驼峰 PascalCase(解决 undefined: ToPascal 报错)
	pascal := toPascal(snake)
	fmt.Println("大驼峰 PascalCase:", pascal)

	// 5. 短横线 kebab-case
	kebab := strcase.ToKebab(originStr)
	fmt.Println("小写短横线 kebab-case:", kebab)

	// 6. 大写短横线
	screamingKebab := strcase.ToScreamingKebab(originStr)
	fmt.Println("大写短横线 KEBAB-CASE:", screamingKebab)

	// ORM 实战:数据库字段转结构体字段
	dbField := "user_name"
	structField := toPascal(dbField)
	fmt.Printf("\n数据库字段[%s] → Go结构体字段[%s]\n", dbField, structField)
}

请添加图片描述

1. 包与导入部分

package main

声明当前文件是可执行程序入口包,不是库文件,编译后能直接运行。

import (
	"fmt"
	"strings"
	"github.com/iancoleman/strcase"
)
  • fmt:标准输入输出库,用来打印控制台日志;
  • strings:Go内置字符串工具,这里用来把首字母转大写;
  • strcase:第三方命名格式转换库,专门处理驼峰、下划线、短横线命名互相转换。

2. 自定义兼容函数 toPascal

// 兼容低版本strcase,手动实现大驼峰 PascalCase
func toPascal(s string) string {
	camel := strcase.ToCamel(s)
	if camel == "" {
		return ""
	}
	// 首字母转大写
	return strings.ToUpper(camel[:1]) + camel[1:]
}

作用背景

低版本 strcase 库没有内置 ToPascal() 大驼峰方法,直接调用会报 undefined 编译错误,所以手动封装兼容方案:

  1. strcase.ToCamel(s):先把字符串转为小驼峰,例:user_infouserInfo
  2. 判断空字符串,避免切片报错;
  3. strings.ToUpper(camel[:1]) 取出第一个字符转大写:uU
  4. 拼接剩余字符,最终得到大驼峰 PascalCaseuserInfoUserInfo

3. main 主函数(程序执行入口)

originStr := "UserInfoUserId"
fmt.Println("原始字符串:", originStr)

定义测试原始字符串「大驼峰格式」,作为转换输入源。

① ToSnake 小写蛇形(数据库字段专用)

snake := strcase.ToSnake(originStr)
fmt.Println("小写蛇形 snake_case:", snake)

输出:user_info_user_id
场景:GORM数据库表字段、mysql列名规范。

② ToScreamingSnake 大写蛇形(常量专用)

screamingSnake := strcase.ToScreamingSnake(originStr)
fmt.Println("大写蛇形 SNAKE_CASE:", screamingSnake)

输出:USER_INFO_USER_ID
场景:Go常量、枚举值命名,如 ORDER_STATUS_SUCCESS

③ ToCamel 小驼峰(变量命名)

camel := strcase.ToCamel(snake)
fmt.Println("小驼峰 camelCase:", camel)

输出:userInfoUserId
场景:Go函数内部局部变量、接口json字段。

④ 自定义toPascal 大驼峰(结构体字段)

pascal := toPascal(snake)
fmt.Println("大驼峰 PascalCase:", pascal)

输出:UserInfoUserId
场景:Go导出结构体、对外暴露的字段名(Go规范:首字母大写才能外部访问)。

⑤ ToKebab 小写短横线(前端/HTTP参数)

kebab := strcase.ToKebab(originStr)
fmt.Println("小写短横线 kebab-case:", kebab)

输出:user-info-user-id
场景:URL路径、前端css类名、http请求header参数。

⑥ ToScreamingKebab 大写短横线

screamingKebab := strcase.ToScreamingKebab(originStr)
fmt.Println("大写短横线 KEBAB-CASE:", screamingKebab)

输出:USER-INFO-USER-ID
场景:环境变量、特殊header标识。

⑦ ORM业务实战示例

dbField := "user_name"
structField := toPascal(dbField)
fmt.Printf("\n数据库字段[%s] → Go结构体字段[%s]\n", dbField, structField)

模拟开发最常用场景:
数据库下划线字段 user_name,自动转为Go结构体规范大驼峰 UserName,用于GORM自动映射表与结构体。

完整运行输出

原始字符串: UserInfoUserId
小写蛇形 snake_case: user_info_user_id
大写蛇形 SNAKE_CASE: USER_INFO_USER_ID
小驼峰 camelCase: userInfoUserId
大驼峰 PascalCase: UserInfoUserId
小写短横线 kebab-case: user-info-user-id
大写短横线 KEBAB-CASE: USER-INFO-USER-ID

数据库字段[user_name] → Go结构体字段[UserName]

整体用途总结

这段代码基于 strcase 实现全风格命名互相转换,解决低版本库缺失Pascal方法的兼容问题,核心用于后端ORM开发、接口参数格式化、常量/结构体命名规范化。
搭配你的鸿蒙PC环境,不能直接 go run,必须先编译、签名再运行:

go build -o main main.go
chmod +x ./main
ohos-signpost ./main
./main

三、执行输出结果

原始字符串: UserInfoUserId
小写蛇形 snake_case: user_info_user_id
大写蛇形 SNAKE_CASE: USER_INFO_USER_ID
小驼峰 camelCase: userInfoUserId
大驼峰 PascalCase: UserInfoUserId
小写短横线 kebab-case: user-info-user-id
大写短横线 KEBAB-CASE: USER-INFO-USER-ID

数据库字段[user_name] 对应Go结构体字段[UserName]

四、常用业务场景说明

  1. GORM ORM 映射
    数据库字段 user_phone 自动转 Go 结构体 UserPhone,反向结构体转数据库字段;
  2. 接口参数转换
    前端传递短横线 user-token,后端统一转驼峰 userToken
  3. 常量定义
    业务枚举常量统一转为大写蛇形 ORDER_STATUS_SUCCESS
  4. 代码生成工具
    解析表结构自动生成结构体时批量格式化字段名。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐