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 }