Эквивалент Go простой реализации на Python и JavaScript

Эквивалент Go простой реализации на Python и JavaScript

Я реализую простую функциональность для системы параметризации структуры данных для встраивания контекста в объекты JSON. Реализация на трех языках: JS, Python и Go. Я неопытный в го. Я внес изменения в Python и JS, но мне сложно реализовать эквивалент Go. Я учу Го, и это будет здорово, если кто-то укажет мне правильное направление.

В программе много других функций для операторов, таких как $let . Простая задача — проверить, является ли ключ объекта оператором. если это правда, то сделайте определенную оценку.

Это реализация JS:

 let deleteMarker = {}; let operators = {}; operators.$let = (template, context) ={amp}gt; { checkUndefinedProperties(template, ['\$let', 'in']); if (!isObject(template['$let'])) { throw new TemplateError('$let value must be an object'); } let variables = {}; Object.keys(template['$let']).forEach(key ={amp}gt; { // The three lines of code below this comment is the simple implementation if (key in operators) { let operator_values = operators[key](template['$let'], context); variables = Object.assign(variables, operator_values); }else if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) { throw new TemplateError('top level keys of $let must follow /[a-zA-Z_][a-zA-Z0-9_]*/'); } variables[key] = render(template['$let'][key], context); if (isObject(variables[key])) { variables[key] = ''; } }); 

Это код Python:

 operators = {} IDENTIFIER_RE = re.compile(r'[a-zA-Z_][a-zA-Z0-9_]*$') @operator('$let') def let(template, context): checkUndefinedProperties(template, ['$let', 'in']) if not isinstance(template['$let'], dict): raise TemplateError("$let value must be an object") subcontext = context.copy() for k, v in template['$let'].items(): # The same here The three lines of code does the trick. if k in operators: operator_values = operators[k](template['$let'], context) subcontext = operator_values.copy() elif not IDENTIFIER_RE.match(k): raise TemplateError('top level keys of $let must follow /[a-zA-Z_][a-zA-Z0-9_]*/') subcontext[k] = renderValue(v, context) if subcontext[k] == DeleteMarker: subcontext[k] = '' try: in_expression = template['in'] except KeyError: raise TemplateError("$let operator requires an `in` clause") return renderValue(in_expression, subcontext) 

Вот код Go

 type operator func(template, context map[string]interface{}) (interface{}, error) var operators = map[string]operator{ "$let": func(template, context map[string]interface{}) (interface{}, error) { if err := restrictProperties(template, "$let", "in"); err != nil { return nil, err } o, ok := template["$let"].(map[string]interface{}) if !ok { return nil, TemplateError{ Message: "$let expects an object", Template: template, } } c := make(map[string]interface{}, len(context)) for k, v := range context { c[k] = v } var err error for k, v := range o { // I wish to implement something similar here c[k], err = render(v, context) if err != nil { return nil, err } if c[k] == deleteMarker { c[k] = "" } } in, ok := template["in"] if !ok { return nil, TemplateError{ Message: "$let requires an 'in' clause", Template: template, } } if err = i.IsValidContext(c); err != nil { return nil, TemplateError{ Message: err.Error(), Template: template, } } return render(in, c) }, 

Ниже я попробовал, но получил: Initialization loop: operators refers to operators

 for k, v := range o { op, ok := operators[k] if ok { if ov, err := op(template["$let"].(map[string]interface{}), context); err == nil { for k, v := range ov.(map[string]interface{}) { c[k] = v } } } 

Заранее спасибо.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector