언어의 변경사항
Generics
Go 1.18에는 유형 매개변수 제안에 설명된 일반 기능의 구현이 포함되어 있습니다. 여기에는 언어에 대한 주요 변경 사항이 포함되지만 완전히 이전 버전과 호환됩니다.
이러한 새로운 언어 변경에는 프로덕션 설정에서 중요한 테스트를 거치지 않은 많은 양의 새 코드가 필요했습니다. 이는 더 많은 사람들이 일반 코드를 작성하고 사용함에 따라 발생할 것입니다.
우리는 이 기능이 잘 구현되고 고품질이라고 믿습니다.
그러나 Go의 대부분의 측면과 달리 실제 경험으로는 그 믿음을 뒷받침할 수 없습니다.
따라서 합리적인 경우 제네릭을 사용하는 것이 좋지만 프로덕션 환경에 제네릭 코드를 배포할 때는 적절한 주의를 기울여야 합니다.
다음은 가장 눈에 띄는 변경 사항의 목록입니다. 보다 포괄적인 개요는 제안을 참조하십시오. 자세한 내용은 언어 사양을 참조하세요.
- 함수 및 유형 선언 구문은 이제 유형 매개변수를 허용합니다.
- 매개변수화된 함수 및 유형은 대괄호로 묶인 유형 인수 목록을 따라 인스턴스화할 수 있습니다.
- 새 토큰 ~이 연산자 및 구두점 집합에 추가되었습니다.
- 인터페이스 유형에 대한 구문은 이제 공용 및 ~T 유형 요소뿐만 아니라 임의 유형(인터페이스의 유형 이름뿐 아니라)의 포함을 허용합니다. 이러한 인터페이스는 유형 제약 조건으로만 사용할 수 있습니다. 인터페이스는 이제 유형 세트와 메소드 세트를 정의합니다.
- 새로 선언된 식별자 any는 빈 인터페이스의 별칭입니다. 인터페이스{} 대신 사용할 수 있습니다.
- 새로 선언된 비교 가능한 식별자는 == 또는 !=를 사용하여 비교할 수 있는 모든 유형의 집합을 나타내는 인터페이스입니다. 형식 제약 조건으로만 사용(또는 포함)할 수 있습니다.
유용할 수 있는 제네릭을 사용하는 세 가지 실험 패키지가 있습니다. 이 패키지는 x/exp 저장소에 있습니다. 그들의 API는 Go 1 보증이 적용되지 않으며 제네릭에 대한 더 많은 경험을 얻게 되면 변경될 수 있습니다.
Constraints.Ordered와 같은 일반 코드에 유용한 제약 조건입니다.
모든 요소 유형의 조각에서 작동하는 일반 함수 모음입니다.
모든 키 또는 요소 유형의 맵에서 작동하는 일반 함수 모음입니다.
현재 제네릭 구현에는 다음과 같은 제한 사항이 있습니다.
- Go 컴파일러는 현재 제네릭 함수 또는 메서드 내에서 형식 선언을 처리할 수 없습니다. Go 1.19에서 이 기능을 지원하기를 바랍니다.
- Go 컴파일러는 현재 사전 선언된 함수 real, imag 및 complex와 함께 매개변수 유형 유형의 인수를 허용하지 않습니다. Go 1.19에서 이 제한을 제거하기를 바랍니다.
- 유형 매개변수 또는 유형 매개변수에 대한 포인터를 구조체 유형의 명명되지 않은 필드로 포함하는 것은 허용되지 않습니다. 마찬가지로 인터페이스 유형에 유형 매개변수를 포함하는 것은 허용되지 않습니다. 이것이 허용될 것인지 여부는 현재로서는 불분명합니다.
- 둘 이상의 용어가 있는 공용체 요소에는 비어 있지 않은 메서드 집합이 있는 인터페이스 유형이 포함될 수 없습니다. 이것이 허용되는지 여부는 현재로서는 불분명합니다.
버그 수정
Go 1.18 컴파일러는 이제 함수 리터럴 내부에 설정되었지만 사용되지 않는 변수에 대해 선언되었지만 사용되지 않은 오류를 올바르게 보고합니다.
Go 1.18 이전에는 컴파일러가 이러한 경우에 오류를 보고하지 않았습니다. 이것은 오랫동안 해결되지 않은 컴파일러 문제 #8560을 수정합니다.
이 변경으로 인해 (잘못된) 프로그램이 더 이상 컴파일되지 않을 수 있습니다.
필요한 수정은 간단합니다. 실제로 잘못된 경우 프로그램을 수정하거나, 예를 들어 빈 식별자 _에 할당하여 문제가 되는 변수를 사용합니다.
go vet이 항상 이 오류를 지적했기 때문에 영향을 받는 프로그램의 수는 매우 적습니다.
Go 1.18 컴파일러는 이제 '1' << 32와 같은 룬 상수 표현식을 사용자 정의 함수의 동작과 일치하여 미리 선언된 함수인 print 및 println에 대한 인수로 전달할 때 오버플로를 보고합니다.
Go 1.18 이전에는 컴파일러가 이러한 경우 오류를 보고하지 않았지만 int64에 맞는 상수 인수를 자동으로 수락했습니다. 이 변경으로 인해 (잘못된) 프로그램이 더 이상 컴파일되지 않을 수 있습니다.
필요한 수정은 간단합니다. 실제로 잘못된 경우 프로그램을 수정하거나 문제가 되는 인수를 올바른 유형으로 명시적으로 변환합니다.
go vet이 항상 이 오류를 지적했기 때문에 영향을 받는 프로그램의 수는 매우 적습니다.
Ports
AMD64
Go 1.18에는 컴파일 시간에 AMD64 아키텍처의 최소 대상 버전을 선택하는 새로운 GOAMD64 환경 변수가 도입되었습니다. 허용되는 값은 v1, v2, v3 또는 v4입니다. 각 상위 레벨에는 추가 프로세서 기능이 필요하고 활용합니다. 자세한 설명은 여기에서 확인할 수 있습니다.
GOAMD64 환경 변수의 기본값은 v1입니다.
RISC-V
Linux의 64비트 RISC-V 아키텍처(linux/riscv64 포트)는 이제 c-archive 및 c-shared 빌드 모드를 지원합니다.
window
windows/arm 및 windows/arm64 포트는 이제 비협조적 선점을 지원하여 해당 기능을 4개의 Windows 포트 모두에 제공하므로 장기간 동안 차단되는 Win32 기능을 호출할 때 발생하는 미묘한 버그를 해결할 수 있기를 바랍니다.
iOS
iOS(ios/arm64 포트) 및 AMD64 기반 macOS(ios/amd64 포트)에서 실행되는 iOS 시뮬레이터에서 Go 1.18에는 이제 iOS 12 이상이 필요합니다. 이전 버전에 대한 지원이 중단되었습니다.
FreeBSD
Go 1.18은 이미 단종된 FreeBSD 11.x에서 지원되는 마지막 릴리스입니다. Go 1.19에는 FreeBSD 12.2+
또는 FreeBSD 13.0+가 필요합니다. FreeBSD 13.0+에는 COMPAT_FREEBSD12 옵션이 설정된 커널이 필요합니다(기본값).
Tools
Fuzzing
Go 1.18에는 퍼징 제안에 설명된 대로 퍼징 구현이 포함되어 있습니다.
시작하려면 퍼징 랜딩 페이지를 참조하세요.
퍼징은 많은 메모리를 소모할 수 있으며 실행되는 동안 컴퓨터의 성능에 영향을 미칠 수 있습니다. 또한 퍼징 엔진은 실행되는 동안 $GOCACHE/fuzz 내의 퍼즈 캐시 디렉토리에 테스트 커버리지를 확장하는 값을 기록합니다. 현재 퍼즈 캐시에 쓸 수 있는 파일 수 또는 총 바이트 수에는 제한이 없으므로 많은 양의 스토리지(수 GB 가능)를 차지할 수 있습니다.
Go command
go get
go get은 더 이상 모듈 인식 모드에서 패키지를 빌드하거나 설치하지 않습니다. go get은 이제 go.mod의 종속성을 조정하는 데 전념합니다.
사실상 -d 플래그는 항상 사용 가능합니다.
현재 모듈 컨텍스트 외부에 실행 파일의 최신 버전을 설치하려면 go install example.com/cmd@latest를 사용하십시오. 최신 버전 대신 모든 버전 쿼리를 사용할 수 있습니다.
이 형태의 go install은 Go 1.16에 추가되었으므로 이전 버전을 지원하는 프로젝트는 go install 및 go get 모두에 대한 설치 지침을 제공해야 할 수 있습니다.
go get now는 업데이트할 go.mod 파일이 없기 때문에 모듈 외부에서 사용될 때 오류를 보고합니다. GOPATH 모드(GO111MODULE=off)에서 이전과 같이 get still 빌드 및 설치 패키지를 사용합니다.
go version
go 명령은 이제 바이너리에 버전 제어 정보를 포함합니다. 여기에는 현재 체크아웃된 개정판, 커밋 시간, 편집된 파일 또는 추적되지 않은 파일이 있는지 여부를 나타내는 플래그가 포함됩니다. Go 명령이 Git, Mercurial, Fossil 또는 Bazaar 리포지토리 내의 디렉터리에서 호출되고 기본 패키지와 포함된 기본 모듈이 동일한 리포지토리에 있는 경우 버전 제어 정보가 포함됩니다. 이 정보는 -buildvcs=false 플래그를 사용하여 생략할 수 있습니다.
또한 go 명령은 빌드 및 도구 태그(-tags로 설정), 컴파일러, 어셈블러 및 링커 플래그(예: -gcflags), cgo가 활성화되었는지 여부, 활성화된 경우 값을 포함하여 빌드에 대한 정보를 포함합니다. cgo 환경 변수(예: CGO_CFLAGS). VCS 및 빌드 정보는 모두 go version -m 파일 또는 runtime/debug.ReadBuildInfo(현재 실행 중인 바이너리의 경우) 또는 새 debug/buildinfo 패키지를 사용하여 모듈 정보와 함께 읽을 수 있습니다.
포함된 빌드 정보의 기본 데이터 형식은 새로운 go 릴리스로 변경될 수 있으므로 이전 버전의 go는 최신 버전의 go에서 생성된 빌드 정보를 처리하지 못할 수 있습니다. go 1.18로 빌드된 바이너리에서 버전 정보를 읽으려면 go version 명령과 go 1.18+의 debug/buildinfo 패키지를 사용하세요.
go mod download
기본 모듈의 go.mod 파일이 go 1.17 이상을 지정하는 경우 이제 인수 없이 go mod 다운로드는 기본 모듈의 go.mod 파일에 명시적으로 필요한 모듈에 대한 소스 코드만 다운로드합니다. (go 1.17 이상 모듈에서 해당 세트에는 기본 모듈에서 패키지 및 테스트를 빌드하는 데 필요한 모든 종속성이 이미 포함되어 있습니다.) 전이 종속성에 대한 소스 코드도 다운로드하려면 go mod download all을 사용하십시오.
go mod vendor
go mod vendor 하위 명령은 이제 -o 플래그를 지원하여 출력 디렉토리를 설정합니다. (다른 go 명령은 -mod=vendor로 패키지를 로드할 때 모듈 루트의 공급업체 디렉토리에서 계속 읽으므로 이 플래그의 주요 용도는 패키지 소스 코드를 수집해야 하는 타사 도구에 사용됩니다.)
go build -asan
go build 명령 및 관련 명령은 이제 주소 새니타이저(C 컴파일러 옵션 -fsanitize=address)로 컴파일된 C(또는 C++) 코드와의 상호 운용을 가능하게 하는 -asan 플래그를 지원합니다.
go mod tidy
go mod kid 명령은 이제 가져온 각 패키지가 빌드 목록의 한 모듈에서만 제공되는지 확인하는 데 소스 코드가 필요한 모듈에 대해 go.sum 파일에 추가 체크섬을 유지합니다. 이 조건은 드물고 적용하지 않으면 빌드 오류가 발생하므로 이 변경 사항은 기본 모듈의 go.mod 파일에 있는 go 버전에 따라 달라지지 않습니다.
go work
go 명령은 이제 "작업 공간" 모드를 지원합니다. go.work 파일이 작업 디렉토리 또는 상위 디렉토리에 있거나 GOWORK 환경 변수를 사용하여 지정된 파일이 있으면 go 명령을 작업 공간 모드로 전환합니다. 작업 공간 모드에서 go.work 파일은 일반적으로 발견된 go.mod 파일을 사용하여 단일 기본 모듈을 지정하는 대신 모듈 확인의 루트로 사용되는 기본 모듈 집합을 결정하는 데 사용됩니다. 자세한 내용은 go work 문서를 참조하십시오.
go test
이제 go 명령은 위에서 설명한 새로운 퍼징 지원에 대한 추가 명령줄 옵션을 지원합니다.
- go test는 -fuzz, -fuzztime 및 -fuzzminimizetime 옵션을 지원합니다. 이에 대한 문서는 go help testflag를 참조하십시오.
- go clean은 -fuzzcache 옵션을 지원합니다. 문서는 go help clean을 참조하십시오.
//go:build lines
Go 1.17에서는 빌드 제약 조건을 작성하는 더 읽기 쉬운 방법으로 //go:build 라인을 도입했습니다. // +build 라인 대신에. Go 1.17부터 gofmt는 //go:build 라인을 추가하여 기존 +build 라인과 일치하고 동기화된 상태로 유지하는 반면 go vet는 동기화되지 않은 경우 진단합니다.
Go 1.18 릴리스가 Go 1.16에 대한 지원 종료를 표시하기 때문에 지원되는 모든 Go 버전은 이제 //go:build 행을 이해합니다. Go 1.18에서 go Fix는 이제 go.mod 파일에서 go 1.17 이상을 선언하는 모듈의 // +build 라인을 제거합니다.
자세한 내용은 https://go.dev/design/draft-gobuild를 참조하세요.
Gofmt
gofmt는 이제 GOMAXPROCS에 비례하는 메모리 제한으로 입력 파일을 동시에 읽고 형식을 지정합니다. 다중 CPU가 있는 시스템에서 gofmt는 이제 훨씬 더 빨라야 합니다.
Vet
제네릭 업데이트 (Updates for Generics)
Vet 도구가 일반 코드를 지원하도록 업데이트되었습니다. 대부분의 경우 형식 매개변수를 해당 형식 집합의 형식으로 대체한 후 해당하는 비제네릭 코드에서 오류를 보고할 때마다 일반 코드에서 오류를 보고합니다. 예를 들어, Vet는 형식 오류를 보고합니다.
func Print[T ~int|~string](t T) {
fmt.Printf("%d", t)
}
Print[string]에 해당하는 제네릭이 아닌 형식 오류를 보고하기 때문입니다.
func PrintString(x string) {
fmt.Printf("%d", x)
}
기존 체커의 정밀도 개선
cmd/vet 검사기 copylock, printf, sortslice, testinggoroutine 및 테스트는 모두 추가 코드 패턴을 처리하기 위해 중간 정도의 정밀도 개선이 있었습니다. 이로 인해 기존 패키지에서 새로 보고된 오류가 발생할 수 있습니다.
예를 들어, printf 검사기는 이제 문자열 상수를 연결하여 생성된 형식 지정 문자열을 추적합니다. 따라서 vet는 다음과 같은 오류를 보고합니다.
// fmt.Printf formatting directive %d is being passed to Println.
fmt.Println("%d"+` ≡ x (mod 2)`+"\n", x%2)
실행 시간(Runtime)
이제 garbage collector는 실행 빈도를 결정할 때 가비지 수집기 작업(예: 스택 스캔)의 힙이 아닌 소스를 포함합니다. 결과적으로 이러한 소스가 중요할 때 garbage collector overhead를 더 예측할 수 있습니다.
대부분의 응용 프로그램에서 이러한 변경 사항은 무시할 수 있습니다.
그러나 일부 Go 애플리케이션은 이제 이전보다 더 적은 메모리를 사용하고 garbage collection에 더 많은 시간을 할애할 수 있으며 그 반대의 경우도 마찬가지입니다. 의도된 해결 방법은 필요한 경우 GOGC를 조정하는 것입니다.
이제 런타임이 운영 체제에 메모리를 더 효율적으로 반환하고 결과적으로 더 적극적으로 작동하도록 조정되었습니다.
Go 1.17은 일반적으로 스택 추적의 인수 형식을 개선했지만 레지스터에 전달된 인수에 대해 부정확한 값을 인쇄할 수 있었습니다.
이것은 정확하지 않을 수 있는 각 값 뒤에 물음표(?)를 인쇄하여 Go 1.18에서 개선되었습니다.
Compiler
Go 1.17은 선택한 운영 체제의 64비트 x86 아키텍처에서 스택 대신 레지스터를 사용하여 함수 인수와 결과를 전달하는 새로운 방법을 구현했습니다. Go 1.18은 64비트 ARM(GOARCH=arm64), big-endian 및 little-endian 64비트 PowerPC(GOARCH=ppc64, ppc64le) 및 64비트 x86 아키텍처(GOARCH=amd64)를 포함하도록 지원되는 플랫폼을 확장합니다. 모든 운영 체제. 64비트 ARM 및 64비트 PowerPC 시스템에서 벤치마킹은 10% 이상의 일반적인 성능 향상을 보여줍니다.
Go 1.17 릴리스 정보에서 언급했듯이 이 변경 사항은 안전한 Go 코드의 기능에 영향을 미치지 않으며 대부분의 어셈블리 코드에 영향을 주지 않도록 설계되었습니다. 자세한 내용은 Go 1.17 릴리스 정보를 참조하세요.
컴파일러는 이제 범위 루프를 포함하거나 for 루프에 레이블이 지정된 함수를 인라인할 수 있습니다.
새로운 -asan 컴파일러 옵션은 새로운 go 명령 -asan 옵션을 지원합니다.
컴파일러의 유형 검사기가 제네릭을 지원하도록 완전히 교체되었기 때문에 일부 오류 메시지는 이제 이전과 다른 문구를 사용할 수 있습니다. 어떤 경우에는 Go 1.18 이전 오류 메시지가 더 자세한 정보를 제공하거나 더 유용한 방식으로 표현되었습니다. Go 1.19에서 이러한 경우를 다룰 예정입니다.
제네릭 지원과 관련된 컴파일러의 변경으로 인해 Go 1.18 컴파일 속도는 Go 1.17 컴파일 속도보다 약 15% 느릴 수 있습니다. 컴파일된 코드의 실행 시간은 영향을 받지 않습니다. Go 1.19에서 컴파일러의 속도를 향상시키려고 합니다.
Linker
링커는 훨씬 적은 수의 재배치를 내보냅니다. 결과적으로 대부분의 코드베이스는 더 빨리 연결되고 연결하는 데 더 적은 메모리가 필요하며 더 작은 바이너리를 생성합니다. Go 바이너리를 처리하는 도구는 Go 1.18의 debug/gosym 패키지를 사용하여 이전 바이너리와 새 바이너리를 투명하게 처리해야 합니다.
새로운 -asan 링커 옵션은 새로운 go 명령 -asan 옵션을 지원합니다.
Bootstrap
소스에서 Go 릴리스를 빌드하고 GOROOT_BOOTSTRAP이 설정되지 않은 경우 Go의 이전 버전은 $HOME/go1.4(Windows의 경우 %HOMEDRIVE%%HOMEPATH%\go1.4) 디렉토리에서 Go 1.4 이상의 부트스트랩 도구 체인을 찾았습니다. 이제 Go는 $HOME/go1.4로 돌아가기 전에 $HOME/go1.17 또는 $HOME/sdk/go1.17을 먼저 찾습니다. Go 1.19에서 부트스트랩을 위해 Go 1.17 이상을 요구할 예정이며 이 변경으로 인해 전환이 더 원활해질 것입니다. 자세한 내용은 go.dev/issue/44505를 참조하세요.
핵심 라이브러리(Core library)
새로운 debug/buildinfo package
새로운 debug/buildinfo 패키지는 모듈 버전, 버전 제어 정보 및 go 명령으로 빌드된 실행 파일에 포함된 빌드 플래그에 대한 액세스를 제공합니다. 현재 실행 중인 바이너리에 대한 runtime/debug.ReadBuildInfo 및 명령줄의 go version -m을 통해 동일한 정보를 사용할 수도 있습니다.
새로운 net/netip 패키지
새 net/netip 패키지는 새 IP 주소 유형인 Addr을 정의합니다. netip.Addr 유형은 기존 net.IP 유형에 비해 메모리를 덜 사용하고 변경이 불가능하며 비교 가능하므로 ==를 지원하고 맵 키로 사용할 수 있습니다.
패키지는 Addr 외에도 IP 및 포트를 나타내는 AddrPort와 네트워크 CIDR 접두사를 나타내는 Prefix를 정의합니다.
패키지는 또한 다음과 같은 새 유형을 만들고 검사하기 위한 여러 함수를 정의합니다. AddrFrom4, AddrFrom16, AddrFromSlice, AddrPortFrom, IPv4Unspecified, IPv6LinkLocalAllNodes, IPv6Unspecified, MustParseAddr, MustParseAddrPort, MustParsePrefix, ParseAddr, ParseAddrPort, ParsePrefix, PrefixFrom
net 패키지에는 기존 메서드와 병렬이지만 더 무거운 net.IP 또는 *net.UDPAddr 유형 대신 netip.AddrPort를 반환하는 새로운 메서드가 포함되어 있습니다. Resolver.LookupNetIP, UDPConn.ReadFromUDPAddrPort, UDPConn.ReadMsgUDPAddrPort, UDPConn.WriteToUDPAddrPort, UDPConn. 쓰기MsgUDPAddrPort. 새로운 UDPConn 메소드는 할당 없는 I/O를 지원합니다.
이제 net 패키지에는 기존 TCPAddr/UDPAddr 유형과 netip.AddrPort: TCPAddrFromAddrPort, UDPAddrFromAddrPort, TCPAddr.AddrPort, UDPAddr.AddrPort 간에 변환하는 기능과 메서드도 포함됩니다.
TLS 1.0 및 1.1은 기본적으로 클라이언트 측에서 비활성화됨
Config.MinVersion이 설정되지 않은 경우 이제 클라이언트 연결에 대해 TLS 1.2로 기본 설정됩니다. 모든 안전한 최신 서버는 TLS 1.2를 지원할 것으로 예상되며 브라우저는 2020년부터 이를 요구했습니다. TLS 1.0 및 1.1은 Config.MinVersion을 VersionTLS10으로 설정하여 계속 지원됩니다. 서버 측 기본값은 TLS 1.0에서 변경되지 않습니다.
기본값은 GODEBUG=tls10default=1 환경 변수를 설정하여 일시적으로 TLS 1.0으로 되돌릴 수 있습니다. 이 옵션은 Go 1.19에서 제거됩니다.
SHA-1 인증서 거부(Rejecting SHA-1 certificates)
crypto/x509는 이제 SHA-1 해시 기능으로 서명된 인증서를 거부합니다. 자체 서명된 루트 인증서에는 적용되지 않습니다. SHA-1에 대한 실제 공격은 2017년부터 입증되었으며 공개적으로 신뢰할 수 있는 인증 기관은 2015년 이후로 SHA-1 인증서를 발급하지 않았습니다.
이것은 GODEBUG=x509sha1=1 환경 변수를 설정하여 일시적으로 되돌릴 수 있습니다. 이 옵션은 Go 1.19에서 제거됩니다.
라이브러리에 대한 사소한 변경점
항상 그렇듯이 Go 1 호환성 약속을 염두에 두고 라이브러리에 다양한 사소한 변경 및 업데이트가 있습니다.
새로운 Writer.AvailableBuffer 메서드는 추가 유사 API와 함께 사용할 수 있도록 비어 있지 않을 수 있는 용량이 있는 빈 버퍼를 반환합니다. 추가 후 버퍼는 후속 쓰기 호출에 제공될 수 있으며 복사를 피할 수 있습니다.
Reader.Reset 및 Writer.Reset 메서드는 이제 버퍼가 없는 개체에서 호출될 때 기본 버퍼 크기를 사용합니다.
새로운 Cut 함수는 구분 기호 주위에서 []바이트를 슬라이스합니다. Index, IndexByte, IndexRune 및 SplitN의 많은 일반적인 사용을 대체하고 단순화할 수 있습니다.
Trim, TrimLeft 및 TrimRight는 이제 할당이 없으며 특히 작은 ASCII 컷셋의 경우 최대 10배 더 빠릅니다.
이제 Title 함수는 더 이상 사용되지 않습니다. 유니코드 구두점 및 언어별 대문자 사용 규칙을 처리하지 않으며 golang.org/x/text/cases 패키지로 대체되었습니다.
P224, P384 및 P521 곡선 구현은 이제 모두 addchain 및 fiat-crypto 프로젝트에서 생성된 코드로 뒷받침되며, 후자는 공식적으로 검증된 산술 연산 모델을 기반으로 합니다. 이제 더 안전한 완전한 공식과 내부 API를 사용합니다. P-224와 P-384는 이제 약 4배 빨라졌습니다. 모든 특정 곡선 구현은 이제 일정 시간입니다.
유효하지 않은 곡선 지점(IsOnCurve 메서드가 false를 반환하고 Unmarshal 또는 유효한 지점에서 작동하는 Curve 메서드에서 절대 반환되지 않는 지점)에 대한 작업은 항상 정의되지 않은 동작이었고 주요 복구 공격으로 이어질 수 있으며 이제 다음에서 지원하지 않습니다. 새로운 백엔드. P224, P384 또는 P521 메서드에 잘못된 포인트가 제공되면 해당 메서드는 이제 임의의 포인트를 반환합니다. 이 동작은 향후 릴리스에서 명시적 패닉으로 변경될 수 있습니다.
새로운 Conn.NetConn 메서드를 사용하면 기본 net.Conn에 액세스할 수 있습니다.
Certificate.Verify는 이제 플랫폼 API를 사용하여 nil VerifyOpts.Roots로 호출되거나 SystemCertPool에서 반환된 루트 풀을 사용할 때 macOS 및 iOS에서 인증서 유효성을 확인합니다.
SystemCertPool은 이제 Windows에서 사용할 수 있습니다.
Windows, macOS 및 iOS에서 SystemCertPool이 반환한 CertPool에 추가 인증서가 추가되면 Certificate.Verify는 두 가지 확인을 수행합니다. 하나는 플랫폼 검증자 API와 시스템 루트를 사용하고 다른 하나는 Go 검증자와 추가 루트를 사용하는 것입니다. . 플랫폼 검증 API에서 반환된 체인이 우선 순위가 지정됩니다.
CertPool.Subjects는 더 이상 사용되지 않습니다. Windows, macOS 및 iOS에서 SystemCertPool에서 반환된 CertPool은 Subjects에서 반환한 슬라이스에 시스템 루트를 포함하지 않는 풀을 반환합니다. 정적 목록은 플랫폼 정책을 적절하게 나타낼 수 없고 플랫폼 API.
StructField 및 BasicType 구조체에는 이제 DW_AT_data_bit_offset 속성 값이 있는 경우 이를 보유하는 DataBitOffset 필드가 있습니다.
The R_PPC64_RELATIVE constant has been added.
File.Symbols 메서드는 이제 파일에 기호 섹션이 없는 경우 내보낸 새 오류 값 ErrNoSymbols를 반환합니다.
매개변수화된 기능 및 유형을 지원하기 위한 go/ast 및 go/token 추가 제안에 따라 go/ast 패키지에 다음이 추가되었습니다.
- FuncType 및 TypeSpec 노드에는 유형 매개변수가 있는 경우 유형 매개변수를 보유하기 위한 새 필드 TypeParams가 있습니다.
- 새로운 표현식 노드 IndexListExpr은 하나 이상의 명시적 유형 인수가 있는 함수 및 유형 인스턴스화에 사용되는 다중 색인이 있는 색인 표현식을 나타냅니다.
새로운 Kind.String 메서드는 수신자 종류에 대해 사람이 읽을 수 있는 이름을 반환합니다.
새로운 상수 TILDE는 매개변수화된 기능 및 유형을 지원하기 위해 go/ast 및 go/token에 대한 추가 제안에 따라 ~ 토큰을 나타냅니다.
새 Config.GoVersion 필드는 허용되는 Go 언어 버전을 설정합니다.
유형 매개변수를 지원하기 위한 go/types 추가 제안에 따라 go/types 패키지에 다음이 추가되었습니다.
- 새 유형 TypeParam, 팩토리 함수 NewTypeParam 및 관련 메소드가 추가되어 유형 매개변수를 나타냅니다.
- 새 유형 TypeParamList는 유형 매개변수 목록을 보유합니다.
- 새 유형 TypeList는 유형 목록을 보유합니다.
- 새로운 팩토리 함수 NewSignatureType은 (수신자 또는 함수) 유형 매개변수를 사용하여 서명을 할당합니다. 이러한 유형 매개변수에 액세스하기 위해 서명 유형에는 두 개의 새로운 메소드 Signature.RecvTypeParams 및 Signature.TypeParams가 있습니다.
- 명명된 유형에는 인스턴스화된 유형의 원래 매개변수화된 유형을 가져오는 Named.Origin, 인스턴스화되거나 매개변수화된 유형의 유형 인수 또는 유형 매개변수를 가져오는 Named.TypeArgs 및 Named.TypeParams, 유형을 설정하는 Named.SetTypeParams가 있습니다. 매개변수(예: 가능한 주기로 인해 명명된 유형의 할당과 유형 매개변수 설정을 동시에 수행할 수 없는 명명된 유형을 가져올 때).
- 인터페이스 유형에는 인터페이스에서 정의한 유형 집합의 속성을 쿼리하기 위한 Interface.IsComparable 및 Interface.IsMethodSet, 유형 제약 조건에 대한 인터페이스가 암시적 인터페이스인지 여부를 설정 및 테스트하기 위한 Interface.MarkImplicit 및 Interface.IsIsImplicit의 4가지 새 메서드가 있습니다.
- 새로운 유형인 Union 및 Term, 팩토리 기능인 NewUnion 및 NewTerm, 관련 메소드가 추가되어 인터페이스의 유형 세트를 나타냅니다.
- 새 기능 Instantiate는 매개변수화된 유형을 인스턴스화합니다.
- 새 Info.Instances 맵은 새 인스턴스 유형을 통해 기능 및 유형 인스턴스화를 기록합니다.
- 새로운 유형의 ArgumentError 및 관련 메소드가 추가되어 유형 인수와 관련된 오류를 나타냅니다.
- 새로운 Config.Context 필드를 통해 유형 검사 패키지 간에 동일한 유형 인스턴스를 쉽게 공유할 수 있도록 새로운 유형의 Context 및 팩토리 기능인 NewContext가 추가되었습니다.
술어인 AssignableTo, ConvertibleTo, Implements, EmoniformIgnoreTags 및 AsssertableTo는 이제 일반화된 인터페이스, 즉 Go 코드에서 유형 제약 조건으로만 사용될 수 있는 인터페이스와 함께 작동합니다. Assertable의 동작은첫 번째 인수가 일반화된 인터페이스인 경우 To가 정의되지 않습니다.
범위 파이프라인 내에서 새로운 {{break}} 명령은 루프를 일찍 종료하고 새로운 {{continue}} 명령은 다음 루프 반복을 즉시 시작합니다.
and 함수는 더 이상 항상 모든 인수를 평가하지 않습니다. false로 평가되는 첫 번째 인수 이후에 인수 평가를 중지합니다. 마찬가지로 or 함수는 이제 true로 평가되는 첫 번째 인수 이후에 인수 평가를 중지합니다. 인수 중 하나가 함수 호출인 경우 차이가 있습니다.
Draw 및 DrawMask 폴백 구현(인수가 가장 일반적인 이미지 유형이 아닐 때 사용)은 이제 해당 인수가 Go 1.17에 추가된 선택적 draw.RGBA64Image 및 image.RGBA64Image 인터페이스를 구현할 때 더 빠릅니다.
net.Error.Temporary는 더 이상 사용되지 않습니다
WebAssembly 대상에서 이제 Transport의 Dial, DialContext, DialTLS 및 DialTLSContext 메서드 필드가 지정된 경우 HTTP 요청을 만드는 데 올바르게 사용됩니다.
새 Cookie.Valid 메서드는 쿠키가 유효한지 여부를 보고합니다.
새로운 MaxBytesHandler 함수는 ResponseWriter 및 Request.Body를 MaxBytesReader로 래핑하는 핸들러를 생성합니다.
User.GroupIds는 이제 cgo를 사용할 수 없을 때 Go 기본 구현을 사용합니다.
새로운 Value.SetIterKey 및 Value.SetIterValue 메서드는 맵 반복자를 소스로 사용하여 값을 설정합니다. Value.Set(iter.Key()) 및 Value.Set(iter.Value())와 동일하지만 더 적은 할당을 수행합니다.
새로운 Value.UnsafePointer 메서드는 값의 값을 unsafe.Pointer로 반환합니다. 이렇게 하면 호출자가 Value.UnsafeAddr 및 Value.Pointer에서 마이그레이션하여 호출 사이트에서 uintptr에서 unsafe.Pointer로의 변환을 수행할 필요가 없습니다(unsafe.Pointer 규칙이 요구하는 대로).
새로운 MapIter.Reset 메서드는 수신기를 변경하여 다른 맵을 반복합니다. MapIter.Reset을 사용하면 많은 맵에서 할당 없이 반복할 수 있습니다.
변환이 안전한지 테스트하기 위해 여러 메서드( Value.CanInt, Value.CanUint, Value.CanFloat, Value.CanComplex )가 Value에 추가되었습니다.
Value.FieldByIndexErr이 포함된 구조체에 대한 nil 포인터를 단계별로 실행할 때 Value.FieldByIndex에서 발생하는 패닉을 피하기 위해 추가되었습니다.
Reflect.Ptr 및 reflect.PtrTo는 나머지 반사 패키지와의 일관성을 위해 각각 reflect.Pointer 및 reflect.PointerTo로 이름이 변경되었습니다. 이전 이름은 계속 작동하지만 향후 Go 릴리스에서 더 이상 사용되지 않습니다.
regexp는 이제 UTF-8 문자열의 잘못된 각 바이트를 U+FFFD로 처리합니다.
BuildInfo 구조체에는 바이너리 빌드 방법에 대한 추가 정보가 포함된 두 개의 새 필드가 있습니다.
- GoVersion은 바이너리를 빌드하는 데 사용된 Go 버전을 보유합니다.
- 설정은 빌드를 설명하는 키/값 쌍을 보유하는 BuildSettings 구조체의 조각입니다.
strconv.Unquote는 이제 유니코드 대리 반쪽을 거부합니다.
새로운 Cut 기능은 구분 기호 주위의 문자열을 슬라이스합니다. Index, IndexByte, IndexRune 및 SplitN의 많은 일반적인 사용을 대체하고 단순화할 수 있습니다.
새로운 Clone 함수는 입력 문자열의 메모리를 참조하는 반환된 복제된 문자열 없이 입력 문자열을 복사합니다.
Trim, TrimLeft 및 TrimRight는 이제 할당이 없으며 특히 작은 ASCII 컷셋의 경우 최대 10배 더 빠릅니다.
이제 Title 함수는 더 이상 사용되지 않습니다. 유니코드 구두점 및 언어별 대문자 사용 규칙을 처리하지 않으며 golang.org/x/text/cases 패키지로 대체되었습니다.
새로운 메서드 Mutex.TryLock, RWMutex.TryLock 및 RWMutex.TryRLock은 잠금이 현재 보유되지 않은 경우 잠금을 획득합니다.
새로운 함수 SyscallN이 Windows용으로 도입되어 임의 개수의 인수를 사용하여 호출할 수 있습니다. 결과적으로 Syscall, Syscall6, Syscall9, Syscall12, Syscall15 및 Syscall18은 더 이상 사용되지 않고 SyscallN이 사용됩니다.
SysProcAttr.Pdeathsig. 이제 FreeBSD에서 지원됩니다.
래퍼 인터페이스가 제거되었습니다.
-run 및 -bench에 대한 인수에서 /의 우선 순위가 높아졌습니다. A/B|C/D는 이전에는 A/(B|C)/D로 처리되었으며 이제는 (A/B)|(C/D)로 처리됩니다.
-run 옵션이 테스트를 선택하지 않으면 -count 옵션이 무시됩니다. 이것은 테스트 기능 자체가 실행될 때마다 실행되는 하위 테스트 세트를 테스트가 변경하는 드문 경우에 기존 테스트의 동작을 변경할 수 있습니다.
새로운 testing.F 유형은 위에서 설명한 새로운 퍼징 지원에서 사용됩니다. 테스트는 이제 명령줄 옵션 -test.fuzz, -test.fuzztime 및 -test.fuzzminimizetime도 지원합니다.
범위 파이프라인 내에서 새로운 {{break}} 명령은 루프를 일찍 종료하고 새로운 {{continue}} 명령은 다음 루프 반복을 즉시 시작합니다.
and 함수는 더 이상 항상 모든 인수를 평가하지 않습니다. false로 평가되는 첫 번째 인수 이후에 인수 평가를 중지합니다. 마찬가지로 or 함수는 이제 true로 평가되는 첫 번째 인수 이후에 인수 평가를 중지합니다. 인수 중 하나가 함수 호출인 경우 차이가 있습니다.
패키지는 새로운 상수 NodeBreak 및 새로운 유형 BreakNode를 통해 새로운 text/template 및 html/template {{break}} 명령을 지원하고, 유사하게 새로운 상수 NodeContinue 및 새로운 유형 ContinueNode를 통해 새로운 {{continue}} 명령을 지원합니다. .
새로운 AppendRune 함수는 룬의 UTF-8 인코딩을 []바이트에 추가합니다.
출처 : https://tip.golang.org/doc/go1.18
'프로그래밍(Web) > Golang' 카테고리의 다른 글
[바미] Golang JSON 필수 값 체크하기. (0) | 2022.07.21 |
---|---|
[바미] Go 1.17 Release Notes (0) | 2022.02.16 |
[바미] Go - os.Args를 이용하여 localhost port 번호 지정하기. (0) | 2021.11.11 |
[바미] Go - Logrus과 lumberjack을 사용하여 Log를 찍어보자! (2) | 2021.06.25 |
[바미] 디버그 모드 시 Version of Delve is too old for this version of Go 에러 뜰 때 해결 방법 (0) | 2021.06.08 |