Использование инструмента рефакторинга gofmt для переименования глобальной переменной

Я экспериментирую с инструментами gofmt для рефакторинга на основе этого сообщения в блоге, у меня есть тривиальный пример:

package main

import (
    "fmt"
)

var v = 12

func main() {
    fmt.Println(v)
}

Я пытаюсь переименовать переменную v в m с помощью этого рецепта:

gofmt -r 'v -> m' -w main.go

Код после рефакторинга выглядит (сломан) как:

package m

import (
    "fmt"
)

var m = m

func m() {
    m
}

Что мне здесь не хватает?

Ответ 1

Существует проблема с тем, что вы пытаетесь, руководства gofmt:

Правило перезаписи, указанное с флагом -r, должно быть строкой формы:

pattern -> replacement

Оба шаблона и замена должны быть действительными выражениями Go. В шаблоне односимвольные строчные > идентификаторы служат в качестве подстановочных знаков, соответствующих произвольным подвыражениям; эти выражения будут заменены теми же идентификаторами в замене.

(выделение добавлено)

Если у вас есть var vee = 12 и используется -r vee -> foo, все будет в порядке. С v -> m однако, v -> m соответствует каждому выражению Go, идентифицирует его как v и заменяет его на m.