69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package cassandra
|
||
|
||
import (
|
||
"log"
|
||
"reflect"
|
||
"unicode"
|
||
)
|
||
|
||
// GetCqlTag 取得指定欄位的 cql tag
|
||
// model 必須為 struct 指標,fieldPtr 為該 struct 欄位的指標
|
||
func GetCqlTag(model interface{}, fieldPtr interface{}) string {
|
||
v := reflect.ValueOf(model)
|
||
// 確保 model 為 struct 指標
|
||
if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
|
||
log.Printf("should be a pointer to struct")
|
||
|
||
return ""
|
||
}
|
||
|
||
s := v.Elem()
|
||
// 遍歷所有欄位,找出地址與傳入 fieldPtr 相符的欄位
|
||
for i := 0; i < s.NumField(); i++ {
|
||
field := s.Type().Field(i)
|
||
fieldVal := s.Field(i)
|
||
// 如果能取地址且地址與 fieldPtr 相等,則取得 tag
|
||
if fieldVal.CanAddr() && fieldVal.Addr().Interface() == fieldPtr {
|
||
return field.Tag.Get("db")
|
||
}
|
||
}
|
||
|
||
return ""
|
||
}
|
||
|
||
// toSnakeCase 將 CamelCase 字串轉換為 snake_case
|
||
func toSnakeCase(s string) string {
|
||
var result []rune
|
||
for i, r := range s {
|
||
if unicode.IsUpper(r) {
|
||
if i > 0 {
|
||
result = append(result, '_')
|
||
}
|
||
result = append(result, unicode.ToLower(r))
|
||
} else {
|
||
result = append(result, r)
|
||
}
|
||
}
|
||
return string(result)
|
||
}
|
||
|
||
// 判斷欄位是否為零值或 nil
|
||
func isZero(v reflect.Value) bool {
|
||
switch v.Kind() {
|
||
case reflect.Ptr, reflect.Interface, reflect.Map, reflect.Slice:
|
||
return v.IsNil()
|
||
default:
|
||
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
|
||
}
|
||
}
|
||
|
||
// 判斷字串是否存在於 slice 中
|
||
func contains(list []string, target string) bool {
|
||
for _, item := range list {
|
||
if item == target {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|