package gen import ( "bytes" "strings" "text/template" ) var ( cacheKeyExpressionTemplate = `cache{{.upperCamelTable}}{{.upperCamelField}}Prefix = "cache#{{.lowerCamelTable}}#{{.lowerCamelField}}#"` keyTemplate = `{{.lowerCamelField}}Key := fmt.Sprintf("%s%v", {{.define}}, {{.lowerCamelField}})` keyRespTemplate = `{{.lowerCamelField}}Key := fmt.Sprintf("%s%v", {{.define}}, resp.{{.upperCamelField}})` keyDataTemplate = `{{.lowerCamelField}}Key := fmt.Sprintf("%s%v", {{.define}}, data.{{.upperCamelField}})` ) type ( Key struct { Define string // cacheKey define,如:cacheUserUserIdPrefix Value string // cacheKey value expression,如:cache#user#userId# Expression string // cacheKey expression,如:cacheUserUserIdPrefix="cache#user#userId#" KeyVariable string // cacheKey 声明变量,如:userIdKey Key string // 缓存key的代码,如 userIdKey:=fmt.Sprintf("%s%v", cacheUserUserIdPrefix, userId) DataKey string // 缓存key的代码,如 userIdKey:=fmt.Sprintf("%s%v", cacheUserUserIdPrefix, data.userId) RespKey string // 缓存key的代码,如 userIdKey:=fmt.Sprintf("%s%v", cacheUserUserIdPrefix, resp.userId) } ) // key-数据库原始字段名,value-缓存key对象 func genCacheKeys(table *InnerTable) (map[string]Key, error) { fields := table.Fields var m = make(map[string]Key) if !table.ContainsCache { return m, nil } for _, field := range fields { if !field.Cache && !field.IsPrimaryKey { continue } t, err := template.New("keyExpression").Parse(cacheKeyExpressionTemplate) if err != nil { return nil, err } var expressionBuffer = new(bytes.Buffer) err = t.Execute(expressionBuffer, map[string]string{ "upperCamelTable": table.UpperCamelCase, "lowerCamelTable": table.LowerCamelCase, "upperCamelField": field.UpperCamelCase, "lowerCamelField": field.LowerCamelCase, }) if err != nil { return nil, err } expression := expressionBuffer.String() expressionAr := strings.Split(expression, "=") define := strings.TrimSpace(expressionAr[0]) value := strings.TrimSpace(expressionAr[1]) t, err = template.New("key").Parse(keyTemplate) if err != nil { return nil, err } var keyBuffer = new(bytes.Buffer) err = t.Execute(keyBuffer, map[string]string{ "lowerCamelField": field.LowerCamelCase, "define": define, }) if err != nil { return nil, err } t, err = template.New("keyData").Parse(keyDataTemplate) if err != nil { return nil, err } var keyDataBuffer = new(bytes.Buffer) err = t.Execute(keyDataBuffer, map[string]string{ "lowerCamelField": field.LowerCamelCase, "upperCamelField": field.UpperCamelCase, "define": define, }) if err != nil { return nil, err } t, err = template.New("keyResp").Parse(keyRespTemplate) if err != nil { return nil, err } var keyRespBuffer = new(bytes.Buffer) err = t.Execute(keyRespBuffer, map[string]string{ "lowerCamelField": field.LowerCamelCase, "upperCamelField": field.UpperCamelCase, "define": define, }) if err != nil { return nil, err } m[field.SnakeCase] = Key{ Define: define, Value: value, Expression: expression, KeyVariable: field.LowerCamelCase + "Key", Key: keyBuffer.String(), DataKey: keyDataBuffer.String(), RespKey: keyRespBuffer.String(), } } return m, nil }