Go 1.14 릴리즈

Golang 2020. 2. 26. 10:10

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/386MacOS10.15(Catalina)부터 MacOS에서 더 이상 지원되지 않습니다. Go는 64비트를 계속 지원합니다.darwin/amd64

Go1.14는 iOS, iPadOS, watch2S및 tvOS(의 32비트 바이너리를 지원하는 마지막 Go릴리즈가 될 것입니다.darwin/armport. Go는 계속해서 64비트를 지원합니다.darwin/arm64port

Window

Windows의 Go바이너리는 이제 DEP(데이터 실행 방지)를 사용하도록 설정되었습니다.

WebAssembly

js.Value 객체를 통해 Go에서 참조 된 JavaScript 값을 가비지 수집 할 수 있습니다.

js.Value값은 더 이상 == 연산자를 사용해서 비교할 수 없으며, 대신에 equai 메서드를 통해서 배교해야 합니다.

js.ValueIsUndefined,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 약속을 염두에두고 라이브러리에 대한 다양한 사소한 변경 및 업데이트가 있습니다.

crypto/tls

SSL 버전 3.0 (SSLv3)에 대한 지원이 제거되었습니다. SSLv3은 TLS보다 먼저 암호화 된 프로토콜입니다.

GOLSBUG 환경 변수를 통해 TLS 1.3을 더 이상 비활성화 할 수 없습니다. Config.MaxVersion 필드를 사용하여 TLS 버전을 구성하십시오.

Config.Certificates 필드를 통해 여러 인증서 체인이 제공되면 이제 피어와 호환되는 첫 번째 인증서 체인이 자동으로 선택됩니다. 이를 통해 예를 들어 ECDSA 및 RSA 인증서를 제공하고 패키지가 자동으로 최상의 인증서를 선택할 수 있습니다. Certificate.Leaf 필드를 설정하지 않으면 이 선택의 성능이 저하됩니다.

새로운 CipherSuitesInsecureCipherSuites 함수는 현재 구현 된 암호 스위트 목록을 리턴합니다. 새로운 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.CertificatesConfig.GetCertificate는 모두 nil 일 수 있습니다. 콜백이 인증서 나 오류를 반환하지 않으면 unrecognized_name이 전송됩니다.

새로운 CertificateRequestInfo.Version 필드는 클라이언트 인증서 콜백에 TLS 버전을 제공합니다.

새로운 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 상수는 이전에 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305TLS_ECDLY_305와 같이 암호화 그룹의 최종 이름을 사용합니다.

crypto/x509

Certificate.CreateCRL은 이제 Ed25519 발급자를 지원합니다.

debug/dwarf

debug/dwarf 패키지는 이제 DWARF 버전 5 읽기를 지원합니다.

새로운 메소드 (* Data) .AddSection은 입력 파일에서 DWARF 데이터로 임의의 새로운 DWARF 섹션 추가를 지원합니다.

새 메소드 (* Reader) .ByteOrder는 현재 컴파일 단위의 바이트 순서를 리턴합니다. 위치 설명과 같은 기본 순서로 인코딩 된 속성을 해석하는 데 사용될 수 있습니다.

새로운 메소드 (* LineReader) .Files는 라인 리더에서 파일 이름 테이블을 리턴합니다. 이것은 AttrDeclFile과 같은 DWARF 속성의 값을 해석하는 데 사용될 수 있습니다.

encoding/asn1

비 정렬 화는 이제 새로운 TagBMPString 상수로 표시되는 ASN.1 문자열 유형 BMPString을 지원합니다.

encoding/json

Decoder type은 현재 디코더 위치의 입력 스트림 바이트 오프셋을 반환하는 새로운 메소드 InputOffset을 지원합니다.

Compact는 더 이상 문서화 된 기능이 아닌 U + 2028 및 U + 2029 문자를 이스케이프하지 않습니다. 올바른 이스케이프에 대해서는 HTMLEscape를 참조하십시오.

문서화 된 동작을 더 밀접하게 따르기 위해 숫자는 더 이상 잘못된 숫자를 허용하지 않습니다. 프로그램이 빈 문자열과 같은 유효하지 않은 숫자를 허용해야하는 경우 유형을 비 정렬 화자로 랩핑하십시오.

go/build

컨텍스트 유형에는 빌드에 대한 작업 디렉토리를 설정하는 데 사용할 수있는 새 필드 Dir이 있습니다. 기본값은 실행중인 프로세스의 현재 디렉토리입니다. 모듈 모드에서는 메인 모듈을 찾는 데 사용됩니다.

go/doc

새로운 기능 NewFromFiles는 * ast.File 목록에서 패키지 문서를 계산하고 예제를 적절한 패키지 요소와 연관시킵니다. 새로운 정보는 패키지, 유형 및 기능 유형의 새 예제 필드와 예제 유형의 새 접미사 필드에서 사용할 수 있습니다.

io/ioutil

TempDir는 이제 이름에 예측 가능한 접두사와 접미사가있는 디렉토리를 만들 수 있습니다. TempFile과 마찬가지로 패턴에 '*'가 포함되어 있으면 임의의 문자열이 마지막 '*'을 대체합니다.

log

새로운 Lmsgprefix 플래그는 행 시작 부분이 아니라 로그 메시지 직전에 선택적 출력 접 두부를 출력하도록 로깅 기능에 지시하는 데 사용될 수 있습니다.

math

새로운 FMA 함수는 x * y 계산의 중간 반올림없이 부동 소수점에서 x * y + z를 계산합니다. 여러 아키텍처가 추가적인 성능을 위해 전용 하드웨어 명령어를 사용하여이 계산을 구현합니다.

math/big

GCD 방법은 이제 입력 a와 b가 0 또는 음수가되도록합니다.

math/bits

새로운 기능인 Rem, Rem32 및 Rem64는 몫이 넘칠 때도 나머지 계산을 지원합니다.

mime

.js.mjs 파일의 기본 유형은 이제 application/javascript가 아닌 text/javascript입니다. 이것은 응용 프로그램 / 자바 스크립트를 더 이상 사용하지 않는 것으로 취급하는 IETF 초안에 따릅니다.

mime/multipart

새로운 Reader 메서드 NextRawPart는 인용 인쇄 가능한 데이터를 투명하게 디코딩하지 않고 다음 MIME 부분을 가져올 수 있도록 지원합니다.

net/http

새로운 헤더 메소드 값을 사용하여 표준화 된 키와 연관된 모든 값을 페치 할 수 있습니다.

새 전송 필드 DialTLSContext를 사용하여 프록시되지 않은 HTTPS 요청에 대한 TLS 연결을 작성하기위한 선택적 다이얼 기능을 지정할 수 있습니다. 이 새로운 필드는 DialTLS 대신 사용할 수 있으며 이제는 더 이상 사용되지 않습니다. DialTLS는 계속 작동하지만 새 코드는 DialTLSContext를 사용해야하므로 더 이상 필요하지 않은 전송으로 다이얼을 취소 할 수 있습니다.

Windows에서 ServeFile은 이제 2GB보다 큰 파일을 올바르게 제공합니다.

net/http/httptest

새로운 서버 필드 EnableHTTP2는 테스트 서버에서 HTTP/2 enabling를 지원합니다.

nett/textproto

새로운 MIMEHeader 메서드 Values를 사용하여 표준화 된 키와 관련된 모든 값을 가져올 수 있습니다.

os/signal

Windows에서 CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT 및 CTRL_SHUTDOWN_EVENT 이벤트는 이제 Control-C 및 Control-Break이 syscall.SIGINT 신호를 생성하는 방법과 유사하게 syscall.SIGTERM 신호를 생성합니다.

plugin

플러그인 패키지는 이제 freebsd/amd64를 지원합니다.

reflect

StructOf는 이제 StructField 요소에서 PkgPath 필드를 설정하여 내 보내지 않은 필드로 구조체 유형 작성을 지원합니다.

runtime

runtime.Goexit는 더 이상 재귀적 panic/recover을 통해 중단 할 수 없습니다.

macOS에서 SIGPIPE는 Go Runtime이 초기화되기 전에 설치된 신호 처리기로 더 이상 전달되지 않습니다. macOS는 스레드가 닫힌 파이프에 쓰지 않고 SIGPIPE를 기본 스레드에 전달하기 때문에 필요합니다.

runtime//pprof

생성 된 프로파일에는 더 이상 인라인 마크에 사용되는 의사 PC가 포함되지 않습니다. 인라인 함수의 심볼 정보는 pprof 도구가 예상하는 형식으로 인코딩됩니다. 최근 릴리스에서 소개 된 회귀에 대한 수정 사항입니다.

strconv

NumError 유형에는 변환에 실패한 이유를 검색하는 데 사용할 수있는 Unwrap 메소드가 있습니다. 이것은 오류가있는 NumError 값 사용을 지원합니다. 기본 오류가 strconv.ErrRange 또는 strconv.ErrSyntax인지 확인합니다.

sync

경쟁이 치열한 Mutex를 잠금 해제하면 CPU가 해당 Mutex를 기다리는 다음 Go Routune으로 직접 전달됩니다. 이는 많은 CPU 수의 머신에서 고도로 경쟁적인 Mutex의 성능을 크게 향상시킵니다.

Testing

테스트 패키지는 이제 T.Cleanup 또는 B.Cleanup을 각각 호출하여 테스트 또는 벤치 마크가 완료된 후 호출되는 정리 기능을 지원합니다.

text/template

text/template는 괄호로 묶은 인수를 함수로 사용할 때 오류를 올바르게보고합니다. 이것은 {{if (eq .F "a") 또는 (eq .F "b")}}와 같은 잘못된 경우에 가장 일반적으로 나타납니다. {{if 또는 (eq .F "a") (eq .F "b")}}로 작성해야합니다. 잘못된 사례는 예상대로 작동하지 않았으며 이제는 오류로보고되어 기능하지 않음을 주장 할 수 없습니다.

unicode

시스템 전체에서 유니 코드 패키지 및 관련 지원이 유니 코드 11.0에서 유니 코드 12.0으로 업그레이드되어 4 개의 새로운 스크립트와 61 개의 새로운 이모티콘을 포함한 554 개의 새로운 문자가 추가되었습니다.

'Golang' 카테고리의 다른 글

Go 1.14 릴리즈  (0) 2020.02.26
json 설정파일 읽어오기  (0) 2018.04.17
고랭 1.9 업데이트  (0) 2017.09.06
Golang | 최신버전으로 업그레이드 할 때 주의점  (0) 2016.08.23
golang | strings 패키지  (0) 2016.08.12
[Golang] mysql, mariadb 원격접속 허용하기  (0) 2016.07.29
블로그 이미지

부들잎

안녕하세요

Tag go, Golang, 고랭

댓글을 달아 주세요

.JSON 설정파일 읽어오기

.JSON 설정파일 읽어오기

github에 코드를 작성하는데 db의 중요한 설정값을 공개할 수는 없기 때문에 설정파일만 따로 보관해야 한다. 자금이 있어서 private github 서비스를 사용할 수도 없는 입장이고, 개인 개발자의 한계.

GO RESTFUL 서브를 만드려고 하는데 설정 파일을 json으로 저장하고, 이를 필요할 때 불러오는 코드를 작성하려고 한다.

go-mssqldb 패키지를 사용해서 microsoft sql server에 접속을 해서 이를 쏴주는 기능을 사용하려고 한다.

우선 저는 아래와 같은 구조를 갖는 setting.json 을 만드려고 합니다.

setting.json

{
    "database": "sqlserver",
    "user":{
        "id":"admin",
        "pwd":"123456789a!"
    },
    "host":{
        "address": "222.111.111.111",
        "port": 1433
    }
}

이제 이를 golang 에 맞는 type struct를 만듭니다.

type config struct

type MssqlConnect struct {
	Database string `json:"database"`
	User struct {
		ID  string `json:"id"`
		Pwd string `json:"pwd"`
	} `json:"user"`
	Host struct {
		Address string `json:"address"`
		Port    int    `json:"port"`
	} `json:"host"`
}

Load Config

다음은 config.json 파일을 읽어오는 과정입니다.

func LoadConfig() (string, error){
	var config MssqlConfig
	file, err := os.Open("setting.json")
	defer file.Close()
	if err != nil {
		Log.Fatal(err)
	}
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&config)
	if err != nil {
		Log.Fatal(err)
	}
	return config, err
}

func main

아래와 같이 사용하면 됩니다.

func main() {
  config, err := LoadConfig()
  fmt.Println(config.Database) // sqlserver
  fmt.Println(config.User.ID) // admin
}

'Golang' 카테고리의 다른 글

Go 1.14 릴리즈  (0) 2020.02.26
json 설정파일 읽어오기  (0) 2018.04.17
고랭 1.9 업데이트  (0) 2017.09.06
Golang | 최신버전으로 업그레이드 할 때 주의점  (0) 2016.08.23
golang | strings 패키지  (0) 2016.08.12
[Golang] mysql, mariadb 원격접속 허용하기  (0) 2016.07.29
블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

고랭 1.9 업데이트

Golang 2017. 9. 6. 02:06

golang 1.9

golang 1.9 release news

소개

최신 Go 버전 1.9 버전은 Go 1.8 이후 6 개월 후에 출시되고, Go 1.x 시리즈에서 10 번째 릴리스입니다. 언어에는 두 가지 변경 사항이 있습니다.
type alias에 대한 지원 추가 및 구현이 부동 소수점 연산을 통합 할 수 있는 시점 정의하는 부분입니다. 대부분의 변경 사항은 toolchain, runtime 및 라이브러리의 구현에 있습니다. 언제나 그렇듯이 이 릴리스는 Go 1 호환성을 유지합니다. 거의 모든 Go 프로그램이 이전처럼 계속해서 컴파일되고 실행될 것입니다.

이 릴리스에서는 명쾌한 단조로운 시간 지원 기능을 추가하고, 패키지 내의 기능 컴파일을 병렬화하며 test helper 기능을 보다 잘 지원하고 새로운 비트 조작 패키지를 포함하며, 새로운 동시 map type을 제공합니다.

오늘 brew update를 했더니 golang이 업그레이드가 된 사실을 알게 되었습니다. 그래서 중요한 변경부분을 적어 봅니다.

언어의 변경점

두가지 변경점이 있습니다.

Go는 패키지간에 유형을 이동하면서 점진적인 코드 복구를 지원하는 type alias을 지원합니다. type 디자인 문서리팩토링에 대한 기사에서 문제를 자세히 설명합니다. 즉, type alias 선언은 다음과 같은 형식을 취합니다.

type T1 = T2

이 선언은 T2로 표시된 type에 대한 대체 철자 인 alias T1을 도입합니다. 즉, T1과 T2는 모두 같은 type을 나타냅니다.

언어의 작은 변경점은 아키텍처의 “fused multiply and add”(FMA) 명령어를 사용하여 중간 결과를 반올림하지 않고, x*y+z를 계산하는 것과 같이 부동 소수점 연산을 함께 구현할 수 있는 언어구현을 의미합니다 x * y. 강제적으로 중간의 반올림을 실시하려면, float64 (x * y) + z라고 기입합니다.

Ports

이 릴리스에는 지원되는 새로운 운영 체제 또는 프로세서 아키텍처가 없습니다.

ppc64x requires POWER8

FreeBSD

OpebBSD 6.0

known Issue

NetBSD 커널 충돌로 인해 1.9 개발동안 NetBSD 빌더 실행이 중단되었습니다 (NetBSD 7.1까지 포함). Go 1.9가 릴리스됨에 따라 NetBSD 7.1.1이 수정되었습니다. 그러나 현재로서는 테스트 통과 한 NetBSD 빌더가 없습니다. 다양한 NetBSD 문제를 조사하는 데 도움을 주시면 감사하겠습니다.

Tools

병렬 컴파일

Go 컴파일러는 이제 다중 코어를 활용하여 패키지의 함수를 병렬로 컴파일하는 기능을 지원합니다. 이것은 별도 패키지의 병렬 컴파일에 대한 go 명령의 기존 지원에 추가됩니다. 병렬 컴파일은 기본적으로 켜져 있지만 환경 변수를 아래와 같이 변경하면 비활성화 할 수 있습니다.

GO19CONCURRENTCOMPILATION = 0

Vendor matching with ./…

Moved GOROOT

Compiler Toolchain

어샘블러

Doc

긴 인수 목록들이 생략됩니다. 이 것은 go doc 의 가독성을 개량했습니다.
구조체 필드에 대한 문서보기가 지원됩니다. 예를 들어 doc http.Client.Jar로 이동하십시오.

type Client struct {
    // Jar specifies the cookie jar.
    //
    // The Jar is used to insert relevant cookies into every
    // outbound Request and is updated with the cookie values
    // of every inbound Response. The Jar is consulted for every
    // redirect that the Client follows.
    //
    // If Jar is nil, cookies are only sent if they are explicitly
    // set on the Request.
    Jar CookieJar

    // ... other fields elided ...

ENV

go env --json을 통해 json 형식으로 출력할 수 있습니다.

Test

Pprof

Vet

vet명령은 go tool에 더 잘 통합되어 있어서 vet는 모든 표준 빌드 플래그를 지원하고, vet 플래그는 이제 vet와 go tool vet에서 사용할 수 있습니다.

Gccgo

Runetime

inlined frames이 포함된 스택호출

성능

언제나 그렇듯이 변경 사항은 매우 일반적이며 다양하여 성능에 대한 정확한 설명을 하기 어렵습니다. 대부분의 프로그램은 가비지 컬렉터의 속도 향상, 향상된 코드 생성 및 코어 라이브러리의 최적화로 인해 조금 더 빠르게 실행될 것입니다.

가비지 콜렉터(Garbage Collector)

세계 표준 가비지 콜렉션을 트리거하는데 사용 된 라이브러리 함수는 이제 동시 가비지 콜렉션을 트리거합니다. 특히 runtime.GC, debug.SetGCPercent 및 debug.FreeOSMemory는 동시 가비지 콜렉션을 트리거하고, 가비지 콜렉션이 완료 될 때까지 호출 goroutine 만 차단합니다.

debug.SetGCPercent 함수는 새로운 GOGC 값으로 인해 즉시 필요한 경우에만 가비지 수집을 트리거합니다. 이렇게하면 GOGC를 즉석에서 조정할 수 있습니다.

큰 오브젝트 할당 성능은 대형 오브젝트가 많은 대형 (> 50GB) 힙을 사용하는 어플리케이션에서 상당히 향상됩니다.

매우 큰 힙에 대해서도 runtime.ReadMemStats 함수는 이제 100μs보다 적게 걸립니다.

코어 라이브러리

새로운 비트조작 패키지

Go 1.9에는 새로운 패키지 인 math/bits가 포함되어 있으며 비트 조작을위한 최적화 된 구현이 포함되어 있습니다. 대부분의 아키텍처에서이 패키지의 함수는 컴파일러에서 추가로 인식되며 추가 성능을 위해 내장 함수로 처리됩니다.

Test.Helper function

새로운 (T).Helper( B).Helper 메서드는 호출 함수를 테스트 도우미 함수로 표시합니다. 파일 및 줄 정보를 인쇄 할 때 해당 기능은 건너 뜁니다. 이렇게하면 사용자에게 유용한 줄 번호를 사용하면서 테스트 도우미 함수를 작성할 수 있습니다.

동시 발생하는 MAP

sync 패키지의 새로운 map 패키지는 amortized-constant-time, 저장 및 삭제가 포함 된 동시 map입니다. 여러 goroutine이 Map의 메소드를 동시에 호출하는 것이 안전합니다.

Profiler Labels

기타 소규모 변경점

문서가 너무 많다… ㅠㅠ

'Golang' 카테고리의 다른 글

Go 1.14 릴리즈  (0) 2020.02.26
json 설정파일 읽어오기  (0) 2018.04.17
고랭 1.9 업데이트  (0) 2017.09.06
Golang | 최신버전으로 업그레이드 할 때 주의점  (0) 2016.08.23
golang | strings 패키지  (0) 2016.08.12
[Golang] mysql, mariadb 원격접속 허용하기  (0) 2016.07.29
블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

이번에 1.7로 업그레이드를 한 후에 go build 를 사용해 봤더니

/usr/local/go/src/runtime/os_linux.go:27 _FUTEX_WAIT redeclared in this block
…

과 같은 에러가 났습니다.
이럴 때에는 전에 설치했던 버전의 찌꺼기가 남아 있기 때문이기 당황해 하지 마시고,

rm -rf /usr/local/go

명령어를 사용해서 삭제하고 다시 새로 설치하면 됩니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

golang | strings 패키지

Golang 2016. 8. 12. 10:10
이거 뭐 한글로 되어 있는 곳이 안 보인다.

strings 패키지

import "strings"

문자열 조작을위한 간단한 함수를 모은 패키지입니다.

Contains 함수

func Contains (s, substr string) bool

Contains는 s에 substr가있을 때 true를 돌려줍니다.

Count 함수

func Count (s, sep string) int

Count는 s 내의 sep의 고유 한 개수를 계산합니다.

Fields 함수

func Fields (s string) [] string

Fields는 문자열 s를 하나 이상의 연속 된 공백으로 분리하여 s의 부분 문자열 배열을 반환합니다. s에 공백 만 포함되어 있지 않은 경우는 빈리스트를 반환합니다.

FieldsFunc 함수

func FieldsFunc (s string, f func (int) bool) [] string

FieldsFunc는 함수 f (c)가 true를 돌려주는 (c는 Unicode 코드 포인트) 위치에서 문자열 s를 분할하고 s 조각의 배열을 돌려줍니다. f (c)가 true를 반환하는 코드 포인트가 s 내에 없었던 경우는 하늘의 조각이 반환됩니다.

HasPrefix 함수

func HasPrefix (s, prefix string) bool

HasPrefix 문자열 s의 시작 부분이 prefix와 일치하는지 테스트합니다.

HasSuffix 함수

func HasSuffix (s, suffix string) bool

HasSuffix 문자열 s의 끝 부분이 suffix과 일치하는지 테스트합니다.

Index 함수

func Index (s, sep string) int

Index는 s에서 sep가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

IndexAny 함수

func IndexAny (s, chars string) int

IndexAny는 s에서 chars의 Unicode 코드 포인트 중 하나가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 어떤 Unicode 코드 포인트도 일치하지 않는 경우는 -1을 돌려줍니다.

IndexFunc 함수

func IndexFunc (s string, f func (r int) bool) int

IndexFunc는 s에서 f (c)를 충족 최초의 Unicode 코드 포인트의 인덱스 또는 찾지 못한 경우 -1을 반환합니다.

IndexRune 함수

func IndexRune (s string, rune int) int

IndexRune는 s에서 Unicode 코드 포인트 rune가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

Join 함수

func Join (a [] string, sep string) string

Join 매개 변수 a의 요소를 결합하여 새로운 문자열을 만듭니다. sep에 지정된 구분 기호가 결합 될 때 요소 사이에 삽입됩니다.

LastIndex 함수

func LastIndex (s, sep string) int

LastIndex는 s에서 sep가 마지막에 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

LastIndexAny 함수

func LastIndexAny (s, chars string) int

LastIndexAny는 chars의 Unicode 코드 포인트 중 하나가 s에서 나타나는 마지막 위치의 인덱스를 돌려줍니다. chars의 어느 Unicode 코드 포인트도 s에 존재하지 않으면 -1을 반환합니다.

LastIndexFunc 함수

func LastIndexFunc (s string, f func (r int) bool) int

LastIndexFunc는 s에서 f (c)를 충족 마지막 Unicode 코드 포인트의 인덱스 또는 찾지 못한 경우 -1을 반환합니다.

Map 함수

func Map (mapping func (rune int) int, s string) string

Map은 문자열 s 내의 모든 문자를 매핑 함수에 의해 변환 해, 그 결과를 새로운 문자열로 반환합니다. 매핑 함수가 마이너스 값을 반환하면 해당 문자를 대체없이 파기됩니다.

Repeat 함수

func Repeat (s string, count int) string

Repeat 문자열 s를 매개 변수 count에 지정한 횟수 복사 한 새로운 문자열을 반환합니다.

Replace 함수

func Replace (s, old, new string, n int) string

Replace는 문자열 s의 복사본에 처음 n, old 부분을 new로 바꾸 (중복 없음) 한 것을 돌려줍니다. n <0 일 때 대체 무제한입니다.

Split 함수

func Split (s, sep string, n int) [] string

Split은 s를 sep를 구분하는 부분 문자열 슬라이스 분리기 사이의 부분 문자열 조각을 반환합니다. sep가 비어있을 때, Split은 UTF-8 시퀀스 단위로 분할합니다. n은 반환 된 부분 문자열의 수를 결정합니다.

n> 0 : 최대 n 개의 부분 문자열. 마지막 부분 문자열에는 분할되지 않은 나머지가 포함된다.
n == 0 : 결과는 ni​​l. (부분 문자열 없음)
n <0 : 모든 부분 문자열.

SplitAfter 함수

func SplitAfter (s, sep string, n int) [] string

SplitAfter는 s에서 sep가 나타난 부분의 바로 슬라이스하고, 이러한 부분 문자열 조각을 반환합니다. sep가 비어있을 때, SplitAfter UTF-8 시퀀스 단위로 분할합니다. n은 반환 된 부분 문자열의 수를 결정합니다.

n> 0 : 최대 n 개의 부분 문자열. 마지막 부분 문자열에는 분할되지 않은 나머지가 포함된다.
n == 0 : 결과는 ni​​l. (부분 문자열 없음)
n <0 : 모든 부분 문자열.
Title 함수
func Title (s string) string

Title 문자열 s 단어의 처음 Unicode 문자를 타이틀 케이스에지도 한 카피를 돌려줍니다.

ToLower 함수

func ToLower (s string) string

ToLower는 문자열 s를 Unicode의 문자에 매핑 된 복사본을 반환합니다.

ToLowerSpecial 함수

func ToLowerSpecial (_case unicode.SpecialCase, s string) string

ToLowerSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 문자에 매핑 된 복사본을 반환합니다.

ToTitle 함수

func ToTitle (s string) string

ToTitle는 문자열 s를 Unicode의 타이틀 케이스에 매핑 된 복사본을 반환합니다.

ToTitleSpecial 함수

func ToTitleSpecial (_case unicode.SpecialCase, s string) string

ToTitleSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 타이틀 케이스에 매핑 된 복사본을 반환합니다.

ToUpper 함수

func ToUpper (s string) string

ToUpper는 문자열 s를 Unicode의 대문자로 맵핑 된 복사본을 반환합니다.

ToUpperSpecial 함수

func ToUpperSpecial (_case unicode.SpecialCase, s string) string

ToUpperSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 대문자로 맵핑 된 복사본을 반환합니다.

Trim 함수

func Trim (s string, cutset string) string

Trim은 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 시작과 끝에서 모두 삭제 한 조각을 반환합니다.

TrimFunc 함수

func TrimFunc (s string, f func (r int) bool) string

TrimFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 시작과 끝에서 모두 삭제 한 조각을 반환합니다.

TrimLeft 함수

func TrimLeft (s string, cutset string) string

TrimLeft은 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 선두에서 삭제 한 조각을 반환합니다.

TrimLeftFunc 함수

func TrimLeftFunc (s string, f func (r int) bool) string

TrimLeftFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 선두에서 삭제 한 조각을 반환합니다.

TrimRight 함수

func TrimRight (s string, cutset string) string

TrimRight는 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 끝에서 삭제 한 조각을 반환합니다.

TrimRightFunc 함수

func TrimRightFunc (s string, f func (r int) bool) string

TrimRightFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 끝에서 삭제 한 조각을 반환합니다.

TrimSpace 함수

func TrimSpace (s string) string

TrimSpace 문자열 s의 시작과 끝에서 Unicode로 정의되고있는 공백을 제외 한 조각을 반환합니다.

Reader 형

Reader는 문자열에서 읽어들이는 Read, ReadByte, ReadRune 함수를 제공합니다.

type Reader string

NewReader 함수

func NewReader (s string) * Reader

NewReader는 s에서로드 할 새로운 Reader를 돌려줍니다. 이것은 bytes.NewBufferString과 거의 동일하지만, 더 효율적이며 또한 읽기 밖에 할 수없는 점이 다릅니다.

(* Reader) Read 함수

func (r * Reader) Read (b [] byte) (n int, err os.Error)

(* Reader) ReadByte 함수

func (r * Reader) ReadByte () (b byte, err os.Error)

(* Reader) ReadRune 함수

func (r * Reader) ReadRune () (rune int, size int, err os.Error)

ReadRune 버퍼에서 다음 UTF-8 인코딩 된 Unicode 코드 포인트를 읽어 들여 돌려줍니다. 로드 바이트 데이터가 없을 때는 os.EOF 오류가 반환됩니다. 바이트 데이터가 잘못된 UTF-8 인코딩 인 경우는 1 바이트 건너 뛰고 U + FFFD 1을 반환합니다.

버그
Title에서 사용하는 단어 협회는 Unicode의 구두점을 제대로 다루지 않습니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

Raspberry pi 3 B+ 에 Raspbian-jessie 가 설치되어 있습니다.

armv6l 용으로 이미 만들어 진 것이 있기 때문에 아주 쉽게 할 수 있습니다.

다운로드

$ wget https://storage.googleapis.com/golang/go1.6.3.linux-armv6l.tar.gz

/usr/local 에 압축을 풀어줍니다.

$ sudo tar -C /usr/local -xzf go1.6.3.linux-armv6l.tar.gz

다음에는 설정을 등록합니다.

PATH”:/usr/local/go/bin:$GOPATH/bin”

참조

sudo apt-get install golang 으로 설치 설정파일


GOARCH="arm"
GOBIN=""
GOCHAR="5"
GOEXE=""
GOHOSTARCH="arm"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/pi/golang"
GORACE=""
GOROOT="/usr/lib/go"
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_arm"
CC="gcc"
GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
pi@raspleaf:~ $ whereis go
go: /usr/bin/go /usr/lib/go /usr/share/go /usr/share/man/man1/go.1.gz

apt-get purge golang 을 하고 난 후에 직접 다운받고 난 뒤의 설정 파일

GOARCH="arm"
GOBIN=""
GOEXE=""
GOHOSTARCH="arm"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/pi/golang"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_arm"
GO15VENDOREXPERIMENT="1"
CC="gcc"
GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
pi@raspleaf:~ $ whereis go
go: /usr/local/go /usr/local/go/bin/go

혹시 설정이 달라질지 몰라서 한번 백업을해 놨습니다. 딱히 바뀌점이 없는 거 보니 제대로 설치가 된 것 같습니다.

그런데, 이상하게 db.sql 을 사용하는데, 1.3 보다 느립니다. 일부러 1.6 버전을 설치했는데, 느려지다니, 좀 실망입니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

개발환경은 다른 곳에 라즈베리파이를 놓고, 다시 다른 곳에서 golang을 통해서 접속을 하려고 합니다.

모든 초반 작업은 root 계정에서 합니다.

 $ mysql -u root -p

DB를 생성

MariaDB [(none)]> CREATE DATABASE test;
MariaDB [(none)]> flush privileges;

mysql 외부 접속을 위한 아이디 생성

를 통해 관리자 아이디로 mysql(mariaDB)에 접속을 하고, 계정을 생성합니다.

내부 접속용 아이디

MariaDB [(none)]> create user ‘이름’@‘localhost’ identified by ‘비밀번호’;
MariaDB [(none)]> flush privileges;

localhost 가 들어가 있으면 내부접속만 허용하는 옵션입니다.

외부 접속용 아이디

MariaDB [(none)]> create user '이름'@'%' identified by '비밀번호'
MariaDB [(none)]> flush privileges;

% 이 들어가면 모든 아이피의 접속을 허용한다는 뜻입니다.
특정 IP에 권한을 주려면 ‘123.123.123.123’ 과 같은 권한을 추가하면 됩니다.

DB 계정에 권한설정

grant all privileges on 디비명.* to 이름@'%' identified by ‘비밀번호';
MariaDB [(none)]> flush privileges;

mysql 설정하기

$sudo vi /etc/mysql/my.cnf

bind-address = 127.0.0.1설정의 맨 앞에 #을 넣어서 주석처리 합니다.

raspberry 에 mysql 포트 열기

mysql 기본포트는 3306를 사용하고 있습니다.
3306 포트를 열어줍니다.

$ iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
$ iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT
$ iptables-save

golang 소스

go get github.com/go-sql-driver/mysq;

를 통해서 소스 mysql 접속 소스를 다운받습니다. ($GOPATH) 폴더에 자동으로 설치가 됩니다.

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "아이디:비밀번호@tcp(접속주소:포트)/디비명")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    var version string
    db.QueryRow("SELECT VERSION()").Scan(&version)
    fmt.Println("Connected to:", version)
}

sql.Open(“mysql”, “아이디:비밀번호@tcp(접속주소:포트)/디비명”)
포트번호까지 전부 적어줘야 합니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요