go1.10beta1 표준 포장의 큰 변경점을 확인하세요.

16749 단어 Go

프로그래밍 언어의 베타 버전을 미리 터치하다.


프로그래밍 언어의β사전 터치판이면 지금까지는 난이도가 높을 수 있어요.
친밀한 개발 환경을 갱신하고 경로를 통과하거나 처음부터 만들어야 한다.
하지만 세계는 바로 컨테이너 시대, 도커를 통해 쉽게 시도할 수 있는 시대다.
β접촉판은 로맨틱해요.
오류가 발견되면 프로그래밍 언어의 관리자로서 친구와 동료에게 자랑할 수 있다.
이렇게 하자.1

Getting Start 😆


https://godoc.org/golang.org/x/build/version/go1.10beta1
폭발 속도로 환경을 구축하다.
$ docker run -it golang
$ go get golang.org/x/build/version/go1.10beta1
$ go1.10beta1 download
$ /root/sdk/go1.10beta1/bin/go version
go version go1.10beta1 linux/amd64
다운로드하는 데 시간이 걸립니다.
몇 번 더 망가뜨리고 싶으신 분들도 계시고요.
도커 이미지를 미리 준비했어요.👍
$ docker pull nnao45/go1.10beta1
$ docker run -it nnao45/go1.10beta1
$ /root/sdk/go1.10beta1/bin/go version
go version go1.10beta1 linux/amd64
/root/sdk/go1.10beta1/bin/go의 패스 위에 베타판이 놓여 있으니 풀패스로 쳐주세요.일부러 PATH가 통과한 버젼1을 비교하기 위해서9.2go도 있어 바로 비교할 수 있어요.
그럼 docker 인상이나 베타 버전 설치 중인 틈틈이 노트를 읽고 발표~!!

이, 알았어!
All of the changes to the standard library are minor. The changes in bytes and net/url are the most likely to require updating of existing programs.
표준 라이브러리에 대한 모든 변경은 매우 가볍다.bytes와net/url의 변경은 기존 프로그램의 업데이트가 필요할 가능성이 가장 높습니다.
이 두 표준 포장의 새로운 방법을 이역으로 보면 되잖아!!
오, 그렇게 말하면 끝이야?
어쨌든 해볼게요.

bytes


bytes
The Fields, FieldsFunc, Split, and SplitAfter each already returned slices pointing into the same underlying array as its input. Go 1.10 changes each of the returned subslices to have capacity equal to its length, so that appending to a subslice will not overwrite adjacent data in the original input.
Fields, FieldsFunc, Split, SplitAfter는 입력한 것과 같은 기본 배열을 이미 되돌려준 막대를 말한다.Go 1.10은 반환되는 각 하위 슬라이스의 길이를 용량과 같게 수정하므로 하위 슬라이스에 추가하면 원래 입력에서 인접한 데이터를 덮어쓰지 않습니다.
일본어로 말하다.

bytes.Fields


이것에 관해서는 Fields 모듈만 보면 OK.
func Fields(s []byte) [][]byte
Fields interprets s as a sequence of UTF-8-encoded code points. It splits the slice s around each instance of one or more consecutive white space characters, as defined by unicode.IsSpace, returning a slice of subslices of s or an empty slice if s contains only white space.
Fields는 s를 UTF-8 인코딩의 코드 포인트 시퀀스로 해석합니다.유니버설입니다.IsSpace 정의와 같은 연속 공백 문자의 인스턴스 주위로 슬라이스를 분할합니다.s의 하위 슬라이스나 빈 슬라이스만 빈 슬라이스로 되돌아옵니다.
뭐, 네 움직임을 알겠다.

go1.9.2의 경우

package main

import (
    "fmt"
    "bytes"
)

func main() {
    b := []byte("  foo bar  baz   ")
    fmt.Printf("%q\n", bytes.Fields(b))    //=>    ["foo" "bar" "baz"]
    fmt.Println(len(bytes.Fields(b)))      //=>    3
    fmt.Println(cap(bytes.Fields(b)))      //=>    3    
    for i, sub := range bytes.Fields(b) {
            fmt.Printf("index:%d %q\n", i, sub)     
            fmt.Println(len(sub))
            fmt.Println(cap(sub))
            /*
            index:0 "foo"
            3
            30
            index:1 "bar"  
            3
            26
            index:2 "baz"
            3
            21
            */
    }
}
https://play.golang.org/p/b_n5Rv1QvX
어떤 바이트열이 1개 이상의 공간을 포함할 때 그 공간을 구분자로 삼는 것은 마치 배열을 다시 조합해서 되돌아오는 함수와 같다. (웃음을 사용한 적이 없다)
응?확실하다.'foo'와'bar'의 용량이 확실히 크다고 느낀다.utf-8 문자열의 []byte라면 3byte면 될 것 같아요.

go1.10beta1의 경우

package main

import (
    "fmt"
    "bytes"
)

func main() {
    b := []byte("  foo bar  baz   ")
    fmt.Printf("%q\n", bytes.Fields(b))    //=>    ["foo" "bar" "baz"]
    fmt.Println(len(bytes.Fields(b)))      //=>    3
    fmt.Println(cap(bytes.Fields(b)))      //=>    3    
    for i, sub := range bytes.Fields(b) {
            fmt.Printf("index:%d %q\n", i, sub)     
            fmt.Println(len(sub))
            fmt.Println(cap(sub))
            /*
            index:0 "foo"
            3
            3
            index:1 "bar"  
            3
            3
            index:2 "baz"
            3
            3
            */
    }
}
오, 예쁜 3byte 같은 최소한의 용량으로 수납하고 있어요!!

net/url


net/url
ResolveReference now preseves multiple leading slashes in the target URL. Previously it rewrote multiple leading slashes to a single slash, which resulted in the http.Client following certain redirects incorrectly.
ResolveReference는 여러 대상 URL의 시작 부분에 슬래시를 저장합니다.지금까지 여러 개의 앞머리의 사선을 하나의 사선으로 개작했기 때문에 특정한 방향을 바꾼 후 http.클라이언트 오류입니다.
예?😱
For example, this code's output has changed:
base, _ := url.Parse("http://host//path//to/page1")
target, _ := url.Parse("page2")
fmt.Println(base.ResolveReference(target))

ResolveReference

func (u *URL) ResolveReference(ref *URL) *URL
ResolveReference resolves a URI reference to an absolute URI from an absolute base URI, per RFC 3986 Section 5.2. The URI reference may be relative or absolute. ResolveReference always returns a new URL instance, even if the returned URL is identical to either the base or reference. If ref is an absolute URL, then ResolveReference ignores base and returns a copy of ref.
ResolveReference는 RFC 3986 섹션 5.2 절대 URI에서 절대 기준 URI 참조를 해결합니다.URI 참조는 상대적이거나 절대적일 수 있습니다.ResolveReference는 기본 또는 참조와 동일한 URL 인스턴스를 반환하더라도 항상 새 URL 인스턴스를 반환합니다.ref가 절대 URL이면 ResolveReference는 베이스를 무시하고 ref의 복사본을 되돌려줍니다.
일본어로 말하다

go1.9.2의 경우

package main

import (
    "fmt"
    "net/url"
)

func main() {
    base, _ := url.Parse("http://host//path//to/page1")
    target, _ := url.Parse("page2")
    fmt.Println(base.ResolveReference(target))  //=>    http://host/path//to/page2
}
요점은 http://host//path//to/page1의 복식 절정 부분이다.
출력의 첫 복식이 사라졌다.

go1.10beta1의 경우

package main

import (
    "fmt"
    "net/url"
)

func main() {
    base, _ := url.Parse("http://host//path//to/page1")
    target, _ := url.Parse("page2")
    fmt.Println(base.ResolveReference(target))  //=>    http://host//path//to/page2
}
잘 고쳤네 퍼스의 실수였지
문서에는 이런 내용이 있다.
Note the doubled slashes around path. In Go 1.9 and earlier, the resolved URL was http://host/path//to/page2: the doubled slash before path was incorrectly rewritten to a single slash, while the doubled slash after path was correctly preserved. Go 1.10 preserves both doubled slashes, resolving to http://host//path//to/page2 as required by RFC 3986.
패스 주위의 두 배 평행봉에 주의하세요.Go1.9 이전에 해결된 URL은 http:/host/path/to/page2입니다.패스 후 두 번의 빗장이 빗장으로 잘못 고쳐지기 전에 쌍빗장은 정확하게 보존된다.RFC 3986 요구 사항의 경우 Go1.10은 http:/host/path/to/page2를 통해 해결된 이중 슬래시를 저장합니다.
This change may break existing buggy programs that unintentionally construct a base URL with a leading doubled slash in the path and inadvertently depend on ResolveReference to correct that mistake. For example, this can happen if code adds a host prefix like http://host/ to a path like/my/api, resulting in a URL with a doubled slash: http://host//my/api .
이 변경에 따라 경로의 시작 부분에 두 개의 사선을 포함하는 기본 URL이 잘못 만들어졌으며, 오류를 잘못 수정하기 위해 ResolveReference에 의존하는 기존 바키 프로그램이 손상될 수 있습니다.예를 들어 코드가 http:/host/와 같은 호스트 접두사를/my/api 같은 경로에 추가하면 http:/host/my/api와 같은 쌍사선 URL이 생성됩니다.
중요한 것은 이 고장을 수리하기 위해 고장 처리 프로그램이 고장날 수도 있다는 것이다.
주의를 받다.

감상


docker는 신이야.도커로 베타 버전을 가볍게 시도해 보세요.
물론 메인 릴리스 버전에서는 이번 릴리즈 노트의 내용이 변경될 가능성이 있고, 릴리즈 노트 이외의 내용도 추가·삭제될 가능성이 있다는 점은 틀리지 않는다. 

좋은 웹페이지 즐겨찾기