얘기 좀 하자.8의 release note

5582 단어
어젯밤에 자신의 포켓을 정리하고 소장한 글들이 읽을 시간이 없다는 것을 발견하고 골라서 골랭이를 골랐다.8의release notes와ross cox의 새해 계획을 읽어봤다.이 수문을 써서 기록하다.
설치8
gvm 설치를 사용하면 여러 버전의 Golang을 관리할 수 있습니다.
No breaking changes
Golang은 1.0에서 시작된 오래된 사용자든 1.7에서 시작된 새로운 친구든 안심하고 코드를 사용할 수 있다고 약속합니다.(swift 프로그래머가 화장실에서 울다가 기절)
언어 차원의 수정
강한 유형 언어 중의 강한 유형 언어로서 int와 int64도 은밀하게 변환할 수 없는 언어,golang1.8 슬그머니 양보했다.golang1.8에서 두 구조체의field 이름과 유형이 완전히 같고 tag만 다르면 서로 convert할 수 있다.그럼요, 현식이에요.
func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // now legal
}

도구 체인
  • 에 기본 GOPATH가 있습니다. 기본값은 $HOME/go
  • 입니다.
  • goget은 -insecure라는 flag이 존재할 때도 에이전트를 간다
  • go 버그 명령이 많아서github에 버그를 보고하고 시스템 정보를 자동으로 채우는 데 사용됩니다.
  • go doc 명령으로 생성된 doc는 더 읽기 쉽다
  • plugin package가 추가되었으나, 현재는 linux에만 사용할 수 있으며, 동적 플러그인 추가에 사용된 것으로 알려졌으며, 아직 사용해 보지 않았다
  • 런타임 및 성능
    gc 메커니즘을 최적화시켰다.여러 개의 고로틴이 동시에 맵을 읽는 것을 방지하는 검사를 최적화했습니다.gc pauses가 현저히 단축됨(usually under 100 microseconds and often as low as 10 microseconds.)번역 속도가 20%에서 30% 빨라졌다고 합니다.
    표준 라이브러리
    위의 release note들은 우리에게 go1을 알려준다.8대 1.7이 좋지만 코드를 쓰는 우리에게도 아무런 느낌이 없는 것 같고 오히려 표준 라이브러리의 변화가 우리에게 큰 영향을 줄 것이다.
    sort
    예전 서열은 이렇게 썼어요.
    type People struct {
      Name string
      Age int
    }
    
    type Peoples []People
    
    func (peoples Peoples) Len() int {
      return len(peoples)
    }
    // Swap for sort
    func (peoples Peoples) Swap(i,j int){
      peoples[i], peoples[j] = peoples[j], peoples[i]
    }
    // Less for sort
    func (peoples Peoples) Less(i,j int) bool{
      return peoples[i].Age < peoples[j].Age
    }
    func main() {
      people := Peoples{
        {"Gopher", 7},
        {"Alice", 55},
        {"Vera", 24},
        {"Bob", 75},
      }
      sort.Sort(people)
      fmt.Println(people)
    }
    

    지금,sort 패키지 안에 슬라이스 함수가 하나 있는데, 너는 앞으로 이렇게 쓸 수 있다.
    //      
    sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
    //      
    sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })
    

    HTTP/2 push
    push기술을 잘 모르는 학생은wiki를 보십시오.push기술은 서버에서 메시지 알림을 전방으로 보내는 데 쓰이는 것이 아닙니다. (그것은 웹소켓이 한 일입니다.)push는 일반적으로 전방에서 요청을 보내서 가져오는 자원 (스크립트, css 파일, 글꼴 파일, 그림 등) 을 서버에서 주동적으로 보내는 것으로 바꿉니다.push가 가져온 장점도 뚜렷하다(청구를 줄이고 push 순서를 지정할 수 있다) 다음은 go1을 사용해보자.8안의push.프로젝트 만들기 http2push 및 파일main.go
    package main
    
    import (
      "fmt"
      "log"
      "net/http"
    )
    
    const mainJS = `console.log("hello world");`
    
    const indexHTML = `
    
        Hello
        
    
    
    
    
    `
    
    func main() {
      http.HandleFunc("/main.js", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, mainJS)
      })
      http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/" {
          http.NotFound(w, r)
          return
        }
        pusher, ok := w.(http.Pusher)
        if ok { // Push is supported. Try pushing rather than waiting for the browser.
          if err := pusher.Push("/main.js", nil); err != nil {
            log.Printf("Failed to push: %v", err)
          }
        }
        fmt.Fprintf(w, indexHTML)
      })
      log.Fatal(http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil))
    }
    

    명령줄을 열고 프로젝트 디렉터리에 들어가서 먼저 실행합니다
    go run $GOROOT/src/crypto/tls/generate_cert.go --host 127.0.0.1
    

    실행 결과는cert.pem과 키를 생성합니다.pem, 그리고 실행
    go run main.go
    

    크롬 열기, 입력
    https://localhost:8080/
    

    개발자 도구를 열면main.js는 브라우저가 자발적으로 보내는 get 요청이 아니라 서버에서 자발적으로push로 온 것입니다.
    http 서버 graceful shutdown 지원
    서버를 호출합니다.Close()하면 서버가 종료되고 서버가 호출됩니다.Shutdown () 이면 서버가 이미 있는 모든 연결을 처리한 다음 닫습니다.
    기대하다.
    ross cox의 타깃인 Russ Cox는 2017년에 Golang의 패키지 관리를 하겠다고 밝혔다. "In particular, other language ecosystems have really raised the bar for what people expect from packagemanagement, and the open source world has mostly agreed on semantic versioning, which provides a useful base for inferring version compatibility."자기도 모르게 눈시울이 젖었다.
    기대보다 기대
    범형 범형 범형...범형이 생기면 맵, 리듀스 따위는 멀어질까.로스 대신은 "Nothing sparks more heated arguments among Go and non-Go developers than the question of whether Go should have support for generics(or how many years ago that should have happened). I don't believe the Go team has ever said"Go does not need geneerics"라고 말했다.What we have said is that there are higher-priority issues facing Go. For example, I believe that better support for package management would have a much larger immediate positive impact on most Go developers than adding generics. But we do certainly understand that for a certain subset of Go use cases, the lack of parametric polymorphism is a significant hindrance."
    신은 마지막으로 우리에게 닭고기 수프 한 그릇을 먹여 주었고 골롱의 범형은 2017년에는 일어나지 않을 것이라고 생각했지만 골롱에서 범형을 디자인하는 것을 멈추지 않을 것이라고 말했다.
    "When I first started thinking about generics for Go in 2008, the main examples to learn from were C#, Java, Haskell, and ML. None of the approaches in those languages seemed like a perfect fit for Go. Today, there are newer attempts to learn from as well, including Dart, Midori, Rust, and Swift.
    It’s been a few years since we ventured out and explored the design space. It is probably time to look around again, especially in light of the insight about mutability and the additional examples set by newer languages. I don’t think generics will happen this year, but I’d like to be able to say I understand the solution space better."

    좋은 웹페이지 즐겨찾기