Go 1.14 Release
Introduce
최신 1.14버전 릴리즈 됐습니다. Go 1.13 이후 6개월만 입니다. 대부분의 변경사항은 toolchian, runtime, libraries의 도구들입니다. 항상 그랬덧이 거의 모든 파일들이 컴파일 되고 실행될 것입니다.
Go 1 사양으로 작성된 프로그램은 해당 사양의 수명 기간 동안 변경없이 올바르게 컴파일 및 실행됩니다. 무한정의 시점에서 Go 2
스펙이 발생할 수 있지만, 그 때까지 Go 1의 향후 "포인트"릴리스 (Go 1.1, Go 1.2 등)가 발생하더라도 현재
작동하는 Go 프로그램이 계속 작동해야합니다.
go command에서 모듈지원 명령어를 production에서 사용할 수 있고, 종속성을 관리하기 위한 go 모듈로 이전(Migration)하는 것이 좋습니다. 만약 go toolchian 에서 이전작업에 문제가 있다면 알려 이슈들 알려주시기 바랍니다.
언어의 변화
인터페이스 overlapping의 제안에 따라, Go 1.14 는 이제 중복되는 메서드 집합이 있는 인터페이스를 포함할 수 있습니다. 내장된 인터페이스의 메서드는 이미 있는 메서드와 동일한 이름과 동일한 서명을 가질 수 있습니다. 이렇게 하면 일반적으로 다이아몬드 모양의 내장 그래프(imbedding graphs)에서 발생하는 문제를 해결할 수 있습니다. 인터페이스에서 명시적으로 선언된 방법은 이전처럼 고유해야 합니다.
Ports
Darwin
Go1.14는 MacOS10.11 ElCapitan에서 실행되는 마지막 릴리스입니다. GO1.15는 macOS10.12 Sierra이상이 필요합니다.
Go1.14는 MacOS에서 32비트 바이너리를 지원하는 마지막 Go릴리즈입니다(darwin/386
MacOS10.15(Catalina)부터 MacOS에서 더 이상 지원되지 않습니다. Go는 64비트를 계속 지원합니다.darwin/amd64
Go1.14는 iOS, iPadOS, watch2S및 tvOS(의 32비트 바이너리를 지원하는 마지막 Go릴리즈가 될 것입니다.darwin/arm
port. Go는 계속해서 64비트를 지원합니다.darwin/arm64
port
Window
Windows의 Go바이너리는 이제 DEP(데이터 실행 방지)를 사용하도록 설정되었습니다.
WebAssembly
js.Value 객체를 통해 Go에서 참조 된 JavaScript 값을 가비지 수집 할 수 있습니다.
js.Value
값은 더 이상 ==
연산자를 사용해서 비교할 수 없으며, 대신에 equai
메서드를 통해서 배교해야 합니다.
js.Value
는 IsUndefined
,IsNull
그리고.IsNaN
와 같은 메서드를 가지고 있습니다.
RISC-V
Go1.14에는 Linux에서 64비트 RISC-V에 대한 실험적 지원 포함(GOOS=linux
,GOARCH=riscv64
)성능, 조립 구문 안정성 및 정확성은 현재 진행 중인 작업이라는 점에 유의하십시오.
FreeBSD
Go는 이제 FreeBSD12.0 이상에서 64비트 ARM아키텍처를 지원합니다(freebsd/arm64
)
Native Client (NaCl)
Go1.13 릴리스 노트에 명시된 바와 같이 Go1.14는 NativeClient플랫폼(GOOS=nacl
).
Illumos
런타임은 이제 runtime.NumCPU 및 기본값 GOMAXPROCS에 대한 영역 CPU 캡 (zone.cpu-cap 자원 제어)을 참조합니다.
Tools
Go command
vendoring
기본 모듈에 최상위 vendor 디렉토리가 있고 go.mod 파일이 go 1.14 이상을 지정하면 go command의 기본값은 -mod=vendor
로 설정되어 해당 플래그를 수행합니다. 새로운 플레그 -mod=mod
는 go command이 대신 vendor 디렉토리가 없는 경우, 같이 모듈 캐시에서 모듈을 로드합니다.
-mod=vendor
를 설정하면 (명시 적으로 또는 기본적으로) go command는 기본 모듈의 vendor / modules.txt 파일이 go.mod 파일과 일치하는지 확인합니다.
go list -m
은 더 이상 vendor
디렉토리에 패키지를 제공하지 않는 전이 종속성을 자동으로 생략하지 않습니다. -mod=vendor
가 설정되고 vendor/modules.txt에 언급되지 않은 모듈에 대한 정보가 요청되면 명시적으로 실패합니다.
Flags
go get 명령은 더 이상 -mod 플래그를 허용하지 않습니다. 이전에는 플래그 설정이 무시되었거나 빌드가 실패했습니다.
go.mod 파일이 읽기 전용이고 최상위 vendor
디렉토리가없는 경우 -mod=readonly
가 기본적으로 설정됩니다.
-modcacherw
는 새로 작성된 플래그가 모듈 캐시에 새로 작성된 디렉토리를 읽기 전용으로 만드는 대신 기본 권한으로 유지하도록 지시하는 새로운 플래그입니다. 이 플래그를 사용하면 테스트나 다른 도구가 실수로 모듈의 확인 된 체크섬에 포함되지 않은 파일을 추가 할 가능성이 높아집니다. 그러나 go clean -modcache
대신 rm -rf를 사용하여 모듈 캐시를 제거 할 수 있습니다.
-modfile=file
은 go command이 모듈 루트 디렉토리에있는 파일 대신 go.mod
파일을 읽고 쓸 수 있도록 지시하는 새로운 플래그입니다. 모듈 루트 디렉토리를 판별하려면 go.mod라는 파일이 여전히 있어야하지만 액세스 할 수는 없습니다. -modfile
이 지정되면 대체 go.sum
파일도 사용됩니다. 경로는 .mod 확장자
를 자르고 .sum
을 추가하여 -modfile 플래그에서 파생됩니다.
환경변수(Environment variables)
GOINSECURE
는 특정 모듈을 원래에서 직접 가져올 때 go command이 HTTPS 연결을 요구하지 않고 인증서 유효성 검사를 건너 뛰도록 지시하는 새로운 환경 변수입니다. 기존 GOPRIVATE
변수와 마찬가지로 GOINSECURE
의 값은 쉼표로 구분 된 glob 패턴
목록입니다.
모듈 외부 명령(Commands outside modules)
GO111MODULE=on
을 설정하여 모듈 인식 모드를 명시 적으로 활성화하면 go.mod 파일이 없을 때 대부분의 모듈 명령의 기능이 더 제한됩니다. 예를 들어, go build, go run 및 기타 빌드 명령은 표준 라이브러리에서 패키지를 빌드하고, 명령행에서 .go 파일로 지정된 패키지만 빌드 할 수 있습니다.
이전에는 go command으로 각 패키지 경로를 최신 버전의 모듈로 확인했지만, 모듈 경로 나 버전은 기록하지 않았습니다. 이로 인해 느리고 생산성이 떨어지는 빌드가 발생했습니다.
호환되지 않는 버전(+incompatible versions)
최신 버전의 모듈에 go.mod 파일이 포함되어 있으면 해당 버전을 명시적으로 요청하거나 이미 요구하지 않는 한 go get은 해당 모듈의 호환되지 않는 major version으로 더 이상 업그레이드되지 않습니다.
go list는 버전 제어에서 직접 patch할 때, 해당 모듈에 대해 호환되지 않는 major version을 생략하지만, proxy에서 보고하는 경우 포함 할 수 있습니다.
go.mod 파일 유지 관리(maintenance)
go mod tidy 이외의 go command는 더 이상 주 모듈의 다른 (전이) 종속성에 의해 암시 된 간접 종속성 버전을 지정하는 require 지시문을 더 이상 제거하지 않습니다.
변경 사항이 외형적일 경우 go mod tidy 이외의 go command는 더 이상 go.mod 파일을 수정하지 않습니다.
-mod=readonly
가 설정되면 go command이 없거나 오류로 인한 go command가 더 이상 실패하지 않습니다.
모듈 다운로드(Module downloading)
go command는 이제 모듈 모드에서 Subversion 저장소를 지원합니다.
go command에는 이제 모듈 프록시 및 기타 HTTP 서버의 일반 텍스트 오류 메시지 스니펫(snippets)이 포함됩니다. 오류 메시지는 유효한 UTF-8이고, 그래픽 문자와 공백으로만 구성된 경우에만 표시됩니다.
Testing
go test -v
는 이제 모든 테스트의 끝이 아닌 t.Log 출력을 스트리밍합니다.
Runtime
이 릴리스에서는 지연된 함수를 직접 호출하는 것과 비교하여 대부분의 지연 사용성능에서 오버헤드가 거의 발생하지 않습니다. 결과적으로 이제 지연은 성능에 중요한 코드에서 오버헤드 걱정없이 사용될 수 있습니다.
go routine
은 이제 비동기적으로 선점(preemption) 할 수 있습니다. 결과적으로 함수 호출이 없는 루프는 더 이상 스케줄러를 교착 상태로 만들거나 가비지 콜렉션을 크게 지연시키지 않습니다. 이는 windows / arm, darwin / arm, js / wasm 및 plan9 / *를 제외한 모든 플랫폼에서 지원됩니다.
선점(preemption) 구현의 결과로 Linux 및 macOS 시스템을 포함한 Unix 시스템에서 Go 1.14로 빌드 된 프로그램은 이전 릴리스로 빌드 된 프로그램보다 더 많은 신호를 수신하게됩니다. 즉, syscall
또는 golang.org/x/sys/unix
와 같은 패키지를 사용하는 프로그램은 EINTR 오류와 함께 더 느린 시스템 호출이 실패함을 의미합니다. 이러한 프로그램은 이러한 방식으로 이러한 오류를 처리해야 하며, 시스템 호출을 다시 시도하기 위해 반복 될 가능성이 높습니다. 이에 대한 자세한 정보는 Linux 시스템의 man 7 signal 또는 다른 시스템의 유사한 문서를 참조하십시오.
페이지 할당자는보다 효율적이며 높은 값의 GOMAXPROCS
에서 Lock경합(lock contention)이 크게 줄어 듭니다. 이는 병렬로 빠른 속도로 대규모 할당을 수행 할 때, 대기 시간이 짧고 처리량이 높을 때 가장 두드러집니다.
시간에 의해 사용되는 내부 타이머 time.After
,
time.Tick
,
net.Conn.SetDeadline
및 친구들은 Lock경합이 적고 컨텍스트 스위치가 적어 더 효율적입니다. 이는 사용자가 눈에 띄게 변경하지 않아야 야기할 수 있는 성능향상입니다.
Core library
새로운 바이트 시퀀스 해싱 패키지
Go 1.14에는 바이트 시퀀스에서 해시 함수를 제공하는 새로운 패키지 hash/maphash
가 포함되어 있습니다. 이러한 해시 함수는 임의의 문자열 또는 바이트 시퀀스를 부호없는 64 비트 정수의 균일 한 분포에 매핑해야하는 해시 테이블 또는 기타 데이터 구조를 구현하는 데 사용됩니다.
해시 함수는 충돌에 강하지만 암호화적으로 안전하지는 않습니다.
주어진 byte sequence의 해시 값은 단일 프로세스 내에서 일관성이 있지만, 프로세스마다 다릅니다.
Library 사소한 변경사항 (Minor changes to the library)
항상 그렇듯이 호환성에 대한 Go 1 약속을 염두에두고 라이브러리에 대한 다양한 사소한 변경 및 업데이트가 있습니다.
SSL 버전 3.0 (SSLv3)에 대한 지원이 제거되었습니다. SSLv3은 TLS보다 먼저 암호화 된 프로토콜입니다.
GOLSBUG 환경 변수를 통해 TLS 1.3을 더 이상 비활성화 할 수 없습니다. Config.MaxVersion
필드를 사용하여 TLS 버전을 구성하십시오.
Config.Certificates
필드를 통해 여러 인증서 체인이 제공되면 이제 피어와 호환되는 첫 번째 인증서 체인이 자동으로 선택됩니다. 이를 통해 예를 들어 ECDSA 및 RSA 인증서를 제공하고 패키지가 자동으로 최상의 인증서를 선택할 수 있습니다. Certificate.Leaf
필드를 설정하지 않으면 이 선택의 성능이 저하됩니다.
새로운 CipherSuites
및 InsecureCipherSuites
함수는 현재 구현 된 암호 스위트 목록을 리턴합니다. 새로운 CipherSuiteName
함수는 암호 스위트 ID의 이름을 리턴합니다.
새로운 (* ClientHelloInfo) .SupportsCertificate
및 (* CertificateRequestInfo) .SupportsCertificate
메소드는 피어가 특정 인증서를 지원하는지 여부를 표시합니다.
tls 패키지는 더 이상 레거시 NPN (Next Protocol Negotiation) 확장을 지원하지 않으며 이제 ALPN 만 지원합니다. 이전 릴리스에서는 두 가지를 모두 지원했습니다. API 변경 사항이 없으며 응용 프로그램이 이전과 동일하게 작동해야합니다. 대부분의 다른 클라이언트와 서버는 표준화 된 ALPN을 위해 NPN 지원을 이미 제거했습니다.
RSA-PSS 서명은 이제 TLS 1.2 핸드 셰이크에서 지원 될 때 사용됩니다. 이는 대부분의 응용 프로그램에는 영향을 미치지 않지만 RSA-PSS 서명을 지원하지 않는 사용자 지정 Certificate.PrivateKey
구현은 새 Certificate.SupportedSignatureAlgorithms
필드를 사용하여 비활성화해야합니다.
Config.GetConfigForClient
가 설정된 경우 Config.Certificates
및 Config.GetCertificate
는 모두 nil 일 수 있습니다. 콜백이 인증서 나 오류를 반환하지 않으면 unrecognized_name이 전송됩니다.
새로운 CertificateRequestInfo.Version
필드는 클라이언트 인증서 콜백에 TLS 버전을 제공합니다.
새로운 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
및 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
상수는 이전에 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
및 TLS_ECDLY_305와
같이 암호화 그룹의 최종 이름을 사용합니다.
Certificate.CreateCRL
은 이제 Ed25519 발급자를 지원합니다.
debug/dwarf
패키지는 이제 DWARF 버전 5 읽기를 지원합니다.
새로운 메소드 (* Data) .AddSection
은 입력 파일에서 DWARF 데이터로 임의의 새로운 DWARF 섹션 추가를 지원합니다.
새 메소드 (* Reader) .ByteOrder
는 현재 컴파일 단위의 바이트 순서를 리턴합니다. 위치 설명과 같은 기본 순서로 인코딩 된 속성을 해석하는 데 사용될 수 있습니다.
새로운 메소드 (* LineReader) .Files
는 라인 리더에서 파일 이름 테이블을 리턴합니다. 이것은 AttrDeclFile
과 같은 DWARF 속성의 값을 해석하는 데 사용될 수 있습니다.
비 정렬 화는 이제 새로운 TagBMPString 상수로 표시되는 ASN.1 문자열 유형 BMPString을 지원합니다.
Decoder type은 현재 디코더 위치의 입력 스트림 바이트 오프셋을 반환하는 새로운 메소드 InputOffset
을 지원합니다.
Compact는 더 이상 문서화 된 기능이 아닌 U + 2028 및 U + 2029 문자를 이스케이프하지 않습니다. 올바른 이스케이프에 대해서는 HTMLEscape를 참조하십시오.
문서화 된 동작을 더 밀접하게 따르기 위해 숫자는 더 이상 잘못된 숫자를 허용하지 않습니다. 프로그램이 빈 문자열과 같은 유효하지 않은 숫자를 허용해야하는 경우 유형을 비 정렬 화자로 랩핑하십시오.
컨텍스트 유형에는 빌드에 대한 작업 디렉토리를 설정하는 데 사용할 수있는 새 필드 Dir이 있습니다. 기본값은 실행중인 프로세스의 현재 디렉토리입니다. 모듈 모드에서는 메인 모듈을 찾는 데 사용됩니다.
새로운 기능 NewFromFiles는 * ast.File 목록에서 패키지 문서를 계산하고 예제를 적절한 패키지 요소와 연관시킵니다. 새로운 정보는 패키지, 유형 및 기능 유형의 새 예제 필드와 예제 유형의 새 접미사 필드에서 사용할 수 있습니다.
TempDir
는 이제 이름에 예측 가능한 접두사와 접미사가있는 디렉토리를 만들 수 있습니다. TempFile과 마찬가지로 패턴에 '*'가 포함되어 있으면 임의의 문자열이 마지막 '*'을 대체합니다.
새로운 Lmsgprefix 플래그는 행 시작 부분이 아니라 로그 메시지 직전에 선택적 출력 접 두부를 출력하도록 로깅 기능에 지시하는 데 사용될 수 있습니다.
새로운 FMA 함수는 x * y 계산의 중간 반올림없이 부동 소수점에서 x * y + z를 계산합니다. 여러 아키텍처가 추가적인 성능을 위해 전용 하드웨어 명령어를 사용하여이 계산을 구현합니다.
GCD 방법은 이제 입력 a와 b가 0 또는 음수가되도록합니다.
새로운 기능인 Rem, Rem32 및 Rem64는 몫이 넘칠 때도 나머지 계산을 지원합니다.
.js
및 .mjs
파일의 기본 유형은 이제 application/javascript가 아닌 text/javascript입니다. 이것은 응용 프로그램 / 자바 스크립트를 더 이상 사용하지 않는 것으로 취급하는 IETF 초안에 따릅니다.
새로운 Reader 메서드 NextRawPart는 인용 인쇄 가능한 데이터를 투명하게 디코딩하지 않고 다음 MIME 부분을 가져올 수 있도록 지원합니다.
새로운 헤더 메소드 값을 사용하여 표준화 된 키와 연관된 모든 값을 페치 할 수 있습니다.
새 전송 필드 DialTLSContext를 사용하여 프록시되지 않은 HTTPS 요청에 대한 TLS 연결을 작성하기위한 선택적 다이얼 기능을 지정할 수 있습니다. 이 새로운 필드는 DialTLS 대신 사용할 수 있으며 이제는 더 이상 사용되지 않습니다. DialTLS는 계속 작동하지만 새 코드는 DialTLSContext를 사용해야하므로 더 이상 필요하지 않은 전송으로 다이얼을 취소 할 수 있습니다.
Windows에서 ServeFile
은 이제 2GB보다 큰 파일을 올바르게 제공합니다.
새로운 서버 필드 EnableHTTP2
는 테스트 서버에서 HTTP/2 enabling를 지원합니다.
새로운 MIMEHeader
메서드 Values를 사용하여 표준화 된 키와 관련된 모든 값을 가져올 수 있습니다.
Windows에서 CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT 및 CTRL_SHUTDOWN_EVENT 이벤트는 이제 Control-C 및 Control-Break이 syscall.SIGINT 신호를 생성하는 방법과 유사하게 syscall.SIGTERM 신호를 생성합니다.
플러그인 패키지는 이제 freebsd/amd64를 지원합니다.
StructOf는 이제 StructField 요소에서 PkgPath 필드를 설정하여 내 보내지 않은 필드로 구조체 유형 작성을 지원합니다.
runtime.Goexit
는 더 이상 재귀적 panic/recover
을 통해 중단 할 수 없습니다.
macOS에서 SIGPIPE는 Go Runtime이 초기화되기 전에 설치된 신호 처리기로 더 이상 전달되지 않습니다. macOS는 스레드가 닫힌 파이프에 쓰지 않고 SIGPIPE를 기본 스레드에 전달하기 때문에 필요합니다.
생성 된 프로파일에는 더 이상 인라인 마크에 사용되는 의사 PC가 포함되지 않습니다. 인라인 함수의 심볼 정보는 pprof 도구가 예상하는 형식으로 인코딩됩니다. 최근 릴리스에서 소개 된 회귀에 대한 수정 사항입니다.
NumError 유형에는 변환에 실패한 이유를 검색하는 데 사용할 수있는 Unwrap 메소드가 있습니다. 이것은 오류가있는 NumError 값 사용을 지원합니다. 기본 오류가 strconv.ErrRange 또는 strconv.ErrSyntax인지 확인합니다.
경쟁이 치열한 Mutex를 잠금 해제하면 CPU가 해당 Mutex를 기다리는 다음 Go Routune으로 직접 전달됩니다. 이는 많은 CPU 수의 머신에서 고도로 경쟁적인 Mutex
의 성능을 크게 향상시킵니다.
테스트 패키지는 이제 T.Cleanup
또는 B.Cleanup
을 각각 호출하여 테스트 또는 벤치 마크가 완료된 후 호출되는 정리 기능을 지원합니다.
text/template
는 괄호로 묶은 인수를 함수로 사용할 때 오류를 올바르게보고합니다. 이것은 {{if (eq .F "a") 또는 (eq .F "b")}}와 같은 잘못된 경우에 가장 일반적으로 나타납니다. {{if 또는 (eq .F "a") (eq .F "b")}}로 작성해야합니다. 잘못된 사례는 예상대로 작동하지 않았으며 이제는 오류로보고되어 기능하지 않음을 주장 할 수 없습니다.
시스템 전체에서 유니 코드 패키지 및 관련 지원이 유니 코드 11.0에서 유니 코드 12.0으로 업그레이드되어 4 개의 새로운 스크립트와 61 개의 새로운 이모티콘을 포함한 554 개의 새로운 문자가 추가되었습니다.