【golang】snakecalm

一、snakecalm 是如何实现?

有很多场景,我们需要自己实现类似 orm 映射的规则,自己实现一个简答的映射规则该怎么实现?
如下代码可以适配大部分场景。
转换规则:ID -> id, User -> user, UserID -> user_id, MyUID -> my_uid, OAuth -> o_auth

orm.go

// GonicCasedName ID -> id, User -> user, UserID -> user_id, MyUID -> my_uid, OAuth -> o_auth
func GonicCasedName(columnName string) string {
	newstr := make([]rune, 0, len(columnName)+3)
	for index, r := range columnName {
		if isASCIIUpper(r) && index > 0 {
			if !isASCIIUpper(newstr[len(newstr)-1]) {
				newstr = append(newstr, '_')
			}
		}

		if !isASCIIUpper(r) && index > 1 {
			l := len(newstr)
			if isASCIIUpper(newstr[l-1]) && isASCIIUpper(newstr[l-2]) {
				newstr = append(newstr, newstr[l-1])
				newstr[l-1] = '_'
			}
		}

		newstr = append(newstr, r)
	}
	return strings.ToLower(string(newstr))
}

func isASCIIUpper(r rune) bool {
	return 'A' <= r && r <= 'Z'
}

//func toASCIIUpper(r rune) rune {
//	if 'a' <= r && r <= 'z' {
//		r -= ('a' - 'A')
//	}
//	return r
//}

orm_test.go

func TestGonicCasedName(t *testing.T) {
	assert := assert.New(t)

	assert.Equal("id", GonicCasedName("ID"))
	assert.Equal("user", GonicCasedName("User"))
	assert.Equal("user_id", GonicCasedName("UserID"))
	assert.Equal("my_uid", GonicCasedName("MyUID"))
	assert.Equal("o_auth", GonicCasedName("OAuth"))
}

二、借助成熟框架实现

gorm:

  1. gorm.TheNamingStrategy.Column("OAuth") => o_auth
  2. gorm.TheNamingStrategy.Column("TestURL2") => test_url_2

xorm:

func TestORM() {
	engine, _ := xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
	engine.SetMapper(core.SameMapper{})
	engine.SetColumnMapper(core.SnakeMapper{})
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼小鱼啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值