>  기사  >  백엔드 개발  >  go fmt 명령의 기능은 무엇입니까

go fmt 명령의 기능은 무엇입니까

青灯夜游
青灯夜游원래의
2023-01-28 11:42:371735검색

go 언어에서 "go fmt" 명령은 주로 개발자가 자신이 작성한 코드 파일의 형식을 지정하는 데 사용됩니다. "go fmt" 명령은 Go 언어 코드 사양에 따라 지정된 코드 패키지에 있는 모든 Go 언어 소스 코드 파일의 코드 형식을 지정합니다. 모든 Go 언어 소스 코드 파일에는 명령 소스 코드 파일, 라이브러리 소스 코드 파일 및 테스트 소스 코드가 포함됩니다. 파일. "go fmt" 명령은 지정된 코드 패키지에 해당하는 디렉터리에 직접 저장된 Go 언어 소스 코드 파일의 형식만 지정합니다.

go fmt 명령의 기능은 무엇입니까

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

go fmt 명령 소개

프로그래밍 언어의 경우 코드 형식이 가장 논란이 되는 문제입니다. 개발자마다 코딩 스타일과 습관이 다를 수 있지만 모든 개발자가 동일한 형식을 사용하여 코드를 작성할 수 있다면. , 개발자는 언어가 해결하려는 문제에 집중할 수 있으므로 개발 시간이 절약됩니다.

Go 언어 개발 팀은 통합된 공식 코드 스타일을 공식화하고 개발자가 코드 형식을 통합된 스타일로 지정할 수 있도록 gofmt 도구(gofmt 또는 go fmt)를 출시했습니다.

gofmt는 표준 입력을 먼저 읽는 cli 프로그램입니다. 파일 경로가 전달되면 파일이 포맷됩니다. 디렉토리가 전달되면 해당 디렉토리의 모든 .go 파일이 포맷됩니다. , 현재 디렉토리의 모든 .go 파일이 포맷됩니다.

Go 언어에는 gofmt를 간단히 캡슐화한 go fmt命令,go fmt 명령도 있습니다.

go fmt 명령의 기능은 무엇입니까

go fmt 명령은 주로 작성한 코드 파일의 형식을 지정하는 데 사용됩니다. [많은 타사 통합 소프트웨어는 go fmt 명령을 사용합니다.]

용도:

go fmt <文件名>.go

go fmt 사용 명령은 gofmt와 함께 더 자주 사용되며 매개변수 -w가 필요합니다. 그렇지 않으면 형식 지정 결과가 파일에 기록되지 않습니다. gofmt -w src를 사용하면 전체 프로젝트의 형식을 지정할 수 있습니다.

매개변수 소개

  • -l은 포맷이 필요한 파일을 표시합니다

  • -w는 다시 작성된 내용을 결과적으로 표준 출력으로 인쇄하는 대신 파일에 직접 씁니다.

  • -r "a[b:len(a)] -> a[b:]" 형식으로 다시 쓰기 규칙을 추가하여 일괄 교체를 용이하게 합니다

  • -s 파일의 코드를 단순화합니다

  • -d는 파일에 쓰는 대신 형식 지정 전후의 차이점을 표시합니다. 기본값은 false입니다.

  • -e는 모든 구문 오류를 표준 출력으로 인쇄합니다. 이 태그를 사용하지 않으면 다른 줄의 처음 10개 오류만 인쇄됩니다.

  • -cpuprofile은 디버깅 모드를 지원하고 해당 CPUfile을 지정된 파일 범위에 씁니다.

go fmt 및 gofmt

go fmt 명령은 Go 언어 코드 사양에 따라 지정된 코드 패키지의 형식을 지정합니다. 모든 Go 언어 소스 코드 파일의 코드 모든 Go 언어 소스 코드 파일에는 명령 소스 코드 파일, 라이브러리 소스 코드 파일 및 테스트 소스 코드 파일이 포함됩니다. 코드 패키지에 하위 코드 패키지도 있는 경우 하위 코드 패키지의 Go 언어 소스 코드 파일은 포함되지 않습니다. 즉, go fmt 명령은 지정된 코드 패키지에 해당하는 디렉터리에 직접 저장된 Go 언어 소스 코드 파일의 형식만 지정합니다.

go doc 명령과 godoc 명령의 관계와 유사하게 go fmt 명령은 gofmt 명령을 간단하게 캡슐화한 것입니다. go fmt 명령 자체는 두 개의 태그를 허용할 수 있습니다. -n 플래그를 사용하면 명령 프로그램이 실제로 실행하지 않고 내부적으로 사용되는 gofmt 명령과 해당 플래그 및 인수를 인쇄할 수 있습니다. -x 플래그는 명령 프로그램이 명령을 인쇄하고 실행하도록 합니다. go fmt 명령 프로그램 내에서 호출하는 gofmt 명령 뒤에 -l 및 -w 표시가 추가되고 지정된 코드 패키지에 있는 모든 Go 언어 소스 파일에 대한 경로가 다음과 같이 매개변수로 사용됩니다.

hc@ubt:~$ go fmt -n pkgtool
gofmt -l -w golang/goc2p/src/pkgtool/envir.go golang/goc2p/src pkgtoolenvir_test.go golang/goc2p/src/pkgtool/fpath.go golang/goc2p/src/pkgtool ipath.go golang/goc2p/src/pkgtool/pnode.go golang/goc2p/src/pkgtool/util.go golang/goc2p/src/pkgtool/util_test.go

gofmt 명령의 매개변수인 Go 언어 소스 코드 파일의 경로는 절대적이지 않고 상대적입니다. 하지만 이는 매개변수를 더 짧게 보이게 하기 위한 것입니다. 따라서 gofmt 명령을 직접 실행할 경우에는 소스코드 파일의 절대 경로를 파라미터로 사용해도 문제가 없다. 실제로 Go 소스 코드 파일이나 Go 언어 소스 코드 파일이 포함된 디렉터리의 상대 경로나 절대 경로를 gofmt 명령의 매개 변수로 사용할 수 있습니다. Go 언어 소스 코드 파일을 매개변수로 포함하는 디렉터리의 절대 경로 또는 상대 경로를 사용하는 경우 gofmt 명령은 이 디렉터리에 있는 Go 언어 소스 코드 파일을 대상 소스 코드 파일로 사용합니다.

gofmt 명령 실행 시 go fmt 명령 프로그램 내부에 추가되는 표시가 수정되었습니다. 다른 태그 세트를 사용하려면 gofmt 명령을 직접 사용해야 합니다. 이제 gofmt 명령이 허용하는 모든 태그를 살펴보겠습니다. 아래 표와 같습니다.

표 0-13 gofmt 명령의 태그 설명

태그 이름 태그 설명
-cpuprofile CPU 프로필을 지정된 파일에 씁니다. 파일 경로가 이 태그의 값으로 사용되어야 합니다.
-d 해당 코드를 직접 포맷하는 대신 포맷 전후의 차이점(있는 경우)을 표시합니다.
-e 대상 소스 코드 파일의 모든 오류를 보고합니다. 기본적으로 처음 10개의 오류만 표시됩니다.
-l 형식 지정 사양을 충족하지 않고 명령 프로그램으로 다시 작성해야 하는 소스 코드 파일의 절대 경로만 표준 출력으로 인쇄합니다. 다시 작성된 모든 내용을 표준 출력으로 인쇄하는 대신.
-r "a[b:len(a)] -> a[b:]" 형식으로 다시 쓰기 규칙을 추가합니다. 일부 추가 형식 지정 규칙을 사용자 정의해야 하는 경우 이를 사용해야 합니다. 규칙 문자열은 이 태그의 값으로 사용되어야 합니다.
-s 파일의 코드를 단순화하세요.
-w 다시 작성된 내용을 결과적으로 표준 출력으로 인쇄하는 대신 파일에 직접 씁니다.

위 표의 정보를 읽고 나면 go fmt 명령의 동작을 쉽게 이해할 수 있습니다. 내부적으로 gofmt 명령을 실행하고 -l 및 -w 플래그를 추가하기 때문입니다. 이렇게 하면 명령 프로그램이 표준 출력으로 다시 작성해야 하는 파일의 절대 경로를 인쇄하고 형식화된 내용을 원본 파일에 직접 쓰게 됩니다. 기본적으로 gofmt 명령은 형식화된 내용을 표준 출력으로 직접 인쇄합니다.

사실 명령 프로그램은 대상 소스 코드 파일의 내용을 추상 구문 트리로 구문 분석합니다. 구문 분석 프로세스 중에 구문 오류가 발견되면 명령 프로그램은 오류 메시지를 표시하고 종료됩니다. 기본적으로 대상 소스 코드 파일의 모든 구문 오류는 표시되지 않습니다. -e 플래그를 추가하여 명령 프로그램이 모든 오류를 표준 출력으로 인쇄하도록 할 수 있습니다.

사용자 정의 재작성 작업

기본적으로 gofmt 명령을 통한 Go 언어 소스 코드 파일 재작성 작업에는 다음과 같은 측면이 포함됩니다.

  • 사전식으로 종속 패키지 가져오기 문 블록에서 코드 패키지 가져오기 경로 정렬 주문순서.

  • 개별 언어 또는 명령문 블록 간의 들여쓰기, 공백 및 줄 바꿈을 표준화합니다. 예를 들어 모든 rn을 n으로 변환합니다.

  • 코드 구문이 약간 수정되었습니다. 예를 들어 변수 유형을 결정하는 데 사용되는 스위치 문 블록에서 중복되는 괄호를 제거합니다.

추가 재작성 작업을 사용자 정의하려면 -r 플래그를 사용해야 합니다. -r 플래그의 값에는 a[b:len(a)] -> a[b:]와 같이 "->"가 포함되어야 합니다. "->"의 왼쪽은 교체가 필요한 표현식의 예여야 하며, 오른쪽은 "->"의 왼쪽 표현식을 교체하는 데 사용되는 표현식의 예여야 합니다.

-r 플래그를 사용하면 명령 프로그램은 소스 코드 파일을 구문 분석하기 전에 이 플래그 값의 대체 표현식과 대체 표현식을 추상 구문 트리의 표현식 노드로 구문 분석합니다. 구문 분석에 실패하면 후속 교체 작업을 수행할 수 없으며 명령 프로그램이 오류 메시지를 인쇄한 후 종료된다는 의미입니다. 구문 분석이 성공하면 명령 프로그램은 소스 코드 파일을 성공적으로 구문 분석한 후 표현식 대체 작업을 수행합니다. 명령 프로그램은 대체된 표현식과 일치하는 소스 코드 파일의 추상 구문 트리에서 노드를 찾아 대체 표현식으로 대체합니다. gofmt 명령은 이미 다음 사용자 정의 교체 작업을 지원하지만 이에 국한되지는 않습니다.

  • 프로그램 엔터티 이름 교체. 프로그램 엔터티에는 변수, 상수, 함수, 구조 및 인터페이스가 포함됩니다. 예: -r=array1->array2 및 -r=FuncA->FuncB.

  • 함수 매개변수 및 결과 유형의 대체도 포함하는 프로그램 엔터티 유형의 대체입니다. 예: -r=string->bool 및 -r=interface{}->int.

  • 중복 괄호 제거. 예를 들어 -r=(x)->x 표시를 이와 같이 설정하면 대상 코드의 a = (-x.s)가 a = -x.s로 다시 작성되고 ((b = - 코드 ))의 x.f())는 b = -x.f()로 다시 작성되며 이로 인해 c = -(x).f도 c = -x.f로 다시 작성되지만 d = (&x).s 및 e = (-x).f는 () 안의 괄호가 제거되지 않습니다. 즉, 명령 프로그램은 의미를 변경하거나 문법적 모호성을 생성하지 않고 코드에서 중복되는 괄호를 제거합니다.

  • 수치 연산 대체. 예를 들어 -r=x+x->x*2 플래그를 이와 같이 설정하면 코드의 모든 x + x가 x * 2로 대체됩니다. 또한, 교체할 표현식에 주석이 포함된 경우 교체 작업 중에 해당 주석이 제거됩니다. 예를 들어 동일한 태그 설정을 사용하면 x /* It's comment */ + x는 여전히 x * 2로 대체됩니다.

  • 매개변수 목록을 기반으로 함수 호출 대체. 예를 들어 -r='funcA(a)->FuncA(a, c)' 플래그를 이와 같이 설정하면 funcA 함수를 호출하고 변수를 매개변수로 사용하는 대상 코드의 명령문이 대체됩니다. 변수 a와 변수 c를 매개변수로 하는 A 문을 사용하여 함수 FuncA를 호출합니다. 대체된 표현식의 매개변수로서의 a는 funcA 함수에 매개변수가 있음을 나타낼 뿐이며 매개변수의 이름은 상관하지 않습니다. 즉, 동일한 플래그 설정을 사용하면 대상 코드의 funcA(b) 또는 funcA(x)가 FuncA(a, c)로 대체됩니다. 또는 -r='funB(x...)->FunC(x)' 플래그를 이와 같이 설정하면 funB(x...) 또는 funB(y...) 또는 기타 유사한 호출 함수 FunC(x)로 대체됩니다. 그중 배열/슬라이스 유형의 매개변수 뒤에 세 개의 영어 반자 마침표 "..."가 오면 이 매개변수의 각 요소를 별도의 매개변수로 함수에 전달해야 함을 나타냅니다. 따라서 이 대체 방법을 사용하면 함수 이름 및/또는 매개변수 목록이 변경된 후 함수를 호출하는 코드를 일괄적으로 추적하고 수정할 수 있습니다.

코드 단순화 작업

gofmt 명령을 실행할 때 -s 플래그를 추가하면 명령 프로그램은 대상 소스 코드 파일에서 단순화할 수 있는 코드를 찾아서 단순화합니다. 단순화에는 다음이 포함됩니다.

  • 배열/슬라이스 초기화에서 불필요한 유형 선언을 제거합니다.

  • 사전 초기화에서 불필요한 유형 선언을 제거합니다.

  • 배열/슬라이스 슬라이싱 작업 중에 불필요한 인덱스 지정을 제거합니다.

  • 消除迭代时的非必要临时变量赋值操作。

这些操作基本上都是出于尽量使用Go语言的语法糖已达到减少代码量的目的。我们在编写Go语言代码的时候应该直接使用这些语法糖而不应该依赖使用gofmt命令来简化。这里所说的Go语言的语法糖,我们在第3章中已经有所介绍。

我们在本小节中详细介绍了go fmt命令和gofmt命令。下面我们再汇总一下这两个命令可以为我们做的事情。如下表。

表0-14 go fmt命令和gofmt命令的功能

功能 go fmt命令 gofmt命令
格式化代码
列出不规范的源码文件
自动改写源码文件
显示对比信息 ×
提示全部错误 ×
简化代码 ×
自定义替换/重构辅助 ×
CPU概要记录 ×

最后,值得一提的是,当我们执行gofmt命令且没有加任何参数的时候,该命令将会进入到交互模式。在这种模式下,我们可以直接在命令行界面中输入源码,并以Ctrl-d结束。在Linux操作系统下,Ctrl-d代表EOF(End Of File,中文译为文件结束符)。需要注意的是,如果在一行的中间按下Ctrl-d,则表示输出“标准输入”的缓存区,所以这时必须连续按两次Ctrl-d。另外,在Windows操作系统下,Ctrl-z代表EOF,所以需要以Ctrl-z结束。在这之后,gofmt命令会像从源码文件中读取源码那样从命令行界面(也称为标准输入)读取源码,并在格式化后将结果打印到命令行界面(也称为标准输出)中。示例如下:

hc@ubt:~$ gofmt -r=&#39;fmt.Println(a)->fmt.Printf("%s\n", a)&#39;
if a=="print" {fmt.Println(a)}                            <----- 在此行的末尾键入回车和Ctrl-d。
warning: rewrite ignored for incomplete programs          <----- 此行及以下就是命令输出的内容。
if a == "print" {
        fmt.Println(a)
}

由上述示例可知,我们可以使用gofmt命令的交互模式格式化任意的代码片段。虽然会显示一行警告信息,但是格式化后的结果仍然会被打印出来。并且,在交互模式下,当我们输入的代码片段不符合Go语言的语法规则时,命令程序也会打印出错误提示信息。在其它方面,命令程序在交互模式与普通模式下的行为也是基本一致的。

【相关推荐:Go视频教程编程教学

위 내용은 go fmt 명령의 기능은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.