A Tour of Go 시도(계속)

13606 단어 Gotech
어제A Tour of Go 시도의 계속.
"A Tour of Go"의'Methods and interfaces'와'conceurrency'의 노트를 읽었다.

메서드

  • Go에는 스테로이드가 없다!!
  • 유형에 대한 정의 방법
  • func 키워드와 방법 이름 사이에 수신기를 수신기 매개 변수로 설명
    매개 변수이기 때문에 일반적인 함수로 기술할 수 있다
  • 모든 유형(삽입식)에 방법을 발표할 수 있습니다.
  • type에 정의해야 합니다.
  • 수신기의 유형은 같은 봉인에 있어야 한다.
  • 포인터 수신기

  • 바늘 수신기의 방법으로 수신기가 가리키는 변수를 바꾼다.
  • 변수 수신기가 원시 변수의 복사본을 조작한다
  • 만약 방법이 바늘 수신기라면 호출할 때 변수나 바늘의 수신기로 사용할 수 있다
  • 바늘 수신기는 변수가 매개 변수로 전송될 때 바늘로 해석된다
  • 방법이 변수 수신기라면 호출할 때 변수나 바늘로 사용할 수 있는 수신기
  • 변수 수신기는 바늘이 매개 변수로 전달될 때 변수에 접근한다
  • 포인터 수신기를 사용하는 이유

  • 수신기가 가리키는 목표 변수를 변경하기 위해
  • 매번 호출 방법이 변수를 복제하는 것을 피하기 위해
  • 이음매


    인터페이스 형식은 방법 서명의 집합에서 정의됩니다.

    내포하다

  • 명확한 구현 선언 없이 유형 정의 방법을 통해 인터페이스 충족
  • 인터페이스 값

  • 인터페이스 값을 호출할 때 이 기본 유형의 같은 이름을 실행하는 방법
  • 발생이 nil일 때 인터페이스

  • 인터페이스의 구체적인 값이 nil라면 예외 없이 nil를 수신기
  • 로 호출합니다

    nil 인터페이스

  • 인터페이스가 nil인 경우 호출 방법 중 운행 시간 오류가 발생
  • 빈 인터페이스

    interface{}: 0 메서드의 인터페이스 유형 지정
  • 모든 유형의 값을 유지할 수 있음
  • 알 수 없는 형식 값을 처리하는 코드에 사용
  • 유형 할당


    인터페이스의 기초값을 이용하다t := i.(T)인터페이스 값i은 구체적인 유형T을 유지하고 기본값T을 변수t에 대입한다.i가 유지되지 않았을 때T 이 문장은 panic을 일으킬 수 있다.t, ok := i.(T)인터페이스 값이 특정 유형을 유지하는지 테스트합니다.i가 유지T되면t이 기본치이고, oktrue이다.
    그렇지 않으면 okfalse,t은유형T의 0값panic이 발생하지 않는다.

    형 switch


    형식 switch의case는 지정한 형식을 지정합니다. 이 값은 지정한 인터페이스 값이 유지하는 값의 유형과 비교됩니다.
    switch v := i.(type) { // `type`キーワードを使用する
        case int:
            // process
        default:
            // caseに一致しなかった場合
            // 変数`v`は同じインターフェース型で値は`i`
    }
    

    Stringers

    string로 표시할 수 있는 유형은 fmt 패키지에서 정의됩니다.
    type Stringer interface {
        String() string
    }
    

    연습(Stringers)


    type IPAddr [4]byte
    
    func (ip IPAddr) String() string {
        return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
    }
    

    잘못

    error 값으로 잘못된 상태를 표시하다
    type error interface {
        Error() string
    }
    
    일반 함수 반환 변수error, 호출원 판정 오류nil를 처리하였습니다.

    연습(오류)


    type ErrNegativeSqrt float64
    
    func (e ErrNegativeSqrt) Error() string {
        return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
    }
    
    func Sqrt(x float64) (float64, error) {
        if x < 0 {
            return x, ErrNegativeSqrt(x)
        }
        ...
    }
    

    Readers


    io 패키지는 읽기 데이터 흐름을 표시합니다.에서는 Reader 인터페이스를 정의합니다.
    Go의 표준 라이브러리에서 파일, 네트워크 연결, 압축, 암호화 등을 통해 이 인터페이스를 실현하였다.
    // データを与えられたバイトスライスへ入れ、入れたバイトのサイズとエラーの値を返します。
    // ストリームの終端は、`io.EOF`のエラーで返します。
    func (T) Read(b []byte) (n int, err error)
    

    연습(Readers)


    func (r MyReader) Read(b []byte) (int, error) {
        var e error
        n := 0
    
        for n < len(b) {
            b[n] = 'A'
            n++
        }
        return n, e
    }
    

    연습(rot13 Reader)


    image


    // imageインターフェースの定義
    package image
    
    type Image interface {
        ColorModel() color.Model
        Bounds() Rectangle
        At(x, y int) color.Color
    }
    

    연습


    여기서부터 "conceurrency"의 장입니다.

    goroutines


    Go의 운영 시간 관리를 위한 경량 스레드입니다.
    go f(x, y, z)
    
    에서 새 goroutine를 실행합니다.
    f,x,y,z의 평가는 집행원(current)의goroutine에서 집행되고 f의 집행은 새로운goroutine에서 집행된다.goroutine 같은 주소 공간에서 실행되기 때문에 공유 메모리에 동기화해야 합니다.

    통로.

    チャネル(Channel)型는 채널 운영자<-의 송신과 수신 값을 사용할 수 있는 채널이다.
    채널은make 함수로 생성됩니다
    ch <- v    // `v`をチャネル`ch`へ送信する
    v := <-ch  // `ch`から受信した変数を`v`へ割り当てる
    
    .
    ch := make(chan int)
    
    그 중 하나가 준비되기 전에 수발을 막아서 goroutine 동기화를 할 수 있다.

    버퍼 채널


    버퍼 채널 초기화
    // 2つ目の引数はバッファの長さ
    ch := make(chan int, 100)
    

    채널 종료

  • 송신측 호출close, 수신측 여부close
  • 확인
    // 受信する値がない、かつチャネルが閉じているなら、`ok`は`false`
    v, ok := <-ch
    

    select

  • select 문장은 여러 개의 통신 조작 대기goroutine를 사용한다.
  • select 여러 개case 중 임의의 하나를 차단하고 준비된 case를 실행한다.

  • 여러 개case를 준비할 때 무작위로 선택case.

  • 어느 것case이 준비되지 않으면 집행selectdefault.
  • 연습(2분목)


    배타적 통제

  • sync.Mutex
  • Lock、Unlock
  • 연습(Web Crawler)

    좋은 웹페이지 즐겨찾기