2017-02-05 1 views
2

Я полагаю, что мой gofmt работает не так, как это должно быть, я прав?Работает ли мой gofmt неправильно или я что-то не понимаю?

Исходный файл:

package main 


import "fmt" 


func main() { 
    fmt.Printf("hello, world\n") 
} 

Тогда я сделал:

gofmt -r 'h -> H' -w "hello.go" 

Содержимое файла после того, как:

package H 


import "fmt" 


func H() { 
H 
} 

ответ

5

Предположительно gofmt работает как его авторов предназначены, которые могут быть разными от того, что вы ожидали. documentation говорит:

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

Как у вас есть только один строчная буква в шаблоне, она соответствует всему подвыражению. А затем заменяет их H. Давайте ваш пример дальше, подумайте:

package main 

import "fmt" 

func compare(a, b int) { 
    if a + b < a * b { 
     fmt.Printf("hello, world\n") 
    } 
} 

После того же gofmt команды выше код становится:

package H 

import "fmt" 

func H(H, H H) { 
    if H+H < H*H { 
     H 
    } 
} 

Если это не то, что вы хотите, то вы должны использовать более конкретное выражение шаблона ,