A Tour of Go 시도(계속)
"A Tour of Go"의'Methods and interfaces'와'conceurrency'의 노트를 읽었다.
메서드
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
이 기본치이고, ok
는true
이다.그렇지 않으면
ok
는false
,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
이 준비되지 않으면 집행select
중default
.연습(2분목)
배타적 통제
연습(Web Crawler)
Reference
이 문제에 관하여(A Tour of Go 시도(계속)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/matsuda/articles/a-tour-of-go-methods텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)