Go 언어 자습서 A Tour of Go의 블러셔 테이블 1-Basics

38639 단어 Go초학자tech
Go 언어 입문의 고정 강좌A Tour of Go를 만들었기 때문에 복습과 동시에 내용을 정리했다.
또 튜토리얼에서는 이전 페이지로 여러 번 돌아가서 확인해야 하기 때문에 다음에 할 사람은 블러셔 용지로 사용할 수 있다.
교정의 대체품으로도 멀리 볼 수 있다.
※ 본 기사는 이식Qita의 글되었습니다.

Packages, variables and functions


패키지 및 가져오기/내보내기

  • 프로그램은main 패키지에서 실행됩니다.
  • import을 통해 봉인을 읽습니다.
  • 대문자로 시작하는 이름을 내보냅니다.
  • // ファイルの冒頭にpackage名を宣言する
    package main
    
    // パッケージのインポートをグループ化できる
    // factored import statementと呼ばれる
    import (
        "fmt"
        "math"
    )
    
    func main() {
        // Printf / Sqrt はそれぞれのパッケージからエクスポートされている
        fmt.Printf("Sqrt(9) is %g\n", math.Sqrt(9))
    
        // 小文字で始まる名前は外部に公開されないので、エラーが発生する
        fmt.Println(math.pi)
    }
    

    함수.

  • 함수는func에서 정의합니다.
  • 매개 변수 형식은 변수 뒤에 쓰여 있습니다.
  • // 2つのintを受け取り、intを返す関数
    func add(x int, y int) int {
        return x + y
    }
    
    // 型が同じ場合は、最後の型以外は省略できる
    func addThree(x, y, z int) int {
        return x + y + z
    }
    
    // 複数の戻り値を返すことができる
    func swap(x, y string) (string, string) {
        return y, x
    }
    
    // 戻り値に名前をつけることができる
    func div(x, y int) (result int) {
        // result変数はこの時点で定義済み
        result = x / y
        // この場合、何も書かずにreturnできる(naked return)
        return
    }
    

    변수 상수


    성명 변수는 매크로 패키지나 함수에서 사용할 수 있습니다
    // 変数はvarで宣言する
    var x, y, z int
    var s string
    
    // initializerで初期化可能、型を省略できる
    var i, j, b = 1, 2, true
    
    // 定数はconstで宣言する
    const K int = 10000
    const Truth = true
    
    func main() {
        // 関数内限定でvarの代わりに:=を使うことができる
        foo := "bar"
        c := 2 + 0.5i // 複素数型
    }
    

    기본(내장)

  • bool
  • string
  • int int8 int16 int32 int64
  • uint uint8 uint16 uint32 uint64
  • byte(uint8의 별칭)
  • rune(int32의 별명)
  • float32 float64
  • complex64 complex128(복형)
  • 제로 값


    초기 값 선언이 없으면 0을 입력합니다.
  • 수치 유형: 0
  • bool: false
  • string: "(빈 문자열)
  • 유형 변환


    명확한 유형 전환이 필요하다
    var i int = 60
    var f float64 = float64(i)
    var u uint = uint(i)
    

    Flow control statements


    for 순환

  • C 언어 등과 동일하게 초기화;조건식설명 후 처리
  • Go에서 다중 언어의while 순환을 for로 대체
  • sum := 0
    
    // カッコは不要
    for i := 0; i < 10; i++ {
        sum += i
    }
    
    // 初期化と後処理は省略可能
    for ;sum < 1000; {
        sum += sum
    }
    
    // セミコロンも省略可能 -> whileループ
    for sum < 10000 {
        sum += sum
    }
    
    // 条件式も省略可能 -> 無限ループ
    for {
        if sum > 100000 {
            break
        }
    }
    

    if

  • for 순환과 동일하며 괄호 필요 없음
  • 초기화 가능 조건 확정용 변수
  • // カッコ不要
    if i > 3 {
        return i
    }
    
    // xのスコープはif-elseブロック内のみ
    if x := i * j + 3; x < 100 {
        return x
    } else {
        return x - 100
    }
    
    // compile error
    return x + 100
    

    switch

  • 한 케이스를 실행하면 나머지 케이스를 실행하지 않기 때문에 각 케이스의break
  • 이 필요하지 않습니다.
  • if와 같은 방식으로 초기화 조건으로 변수 확정
  • case는 상수가 필요 없음
  • // os変数を初期化
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        // freebsd, openbsd, plan9, windows...
        fmt.Printf("%s.\n", os)
    }
    
    // 条件のないswitchも可能(switch trueと同じ)
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:
        fmt.Println("Good afternoon.")
    default:
        fmt.Println("Good evening.")
    }
    

    defer

  • 함수의 집행을 defer에 전달할 때 함수의 끝으로 지연
  • 마지막으로 건네준 defer부터 순서대로 실행(last-in-first-out)
  • func hello() {
        defer fmt.Println("world")
        fmt.Println("hello")
    }
    
    func countDown() {
        for i := 0; i < 10; i++ {
            defer fmt.Print(i)
        }
        // 9876543210と表示される
    }
    

    More types: structs, slices, and maps


    포인터

  • 포인터 지향 값의 스토리지 주소
  • 포인터의 0값은 nil
  • // int型のポインタは *int型
    var p *int
    
    // &オペレータでポインタを引き出す
    var i int = 50
    p = &I
    
    // *オペレータでポインタの指す変数を示す
    j := *p // pからiの値を読みだす
    *p = 40 // pを通してiに値を代入する
    

    struct

  • struct(구조)는장(field)의 집합
  • type Vertex struct {
        X int
        Y int
    }
    
    func test() {
        // Vertexリテラル: field順に値を渡す
        v := Vertex{1, 2}
        v.X = 5
    
        // ポインタを使う
        p := &v
        // ポインタを通してフィールドにアクセスする
        (*p).X = 6
        // 省略してp.Xとも書ける
        p.X = 6
    }
    
    // 初期化時にフィールドの名前を使うことができる
    var (
        v1 = Vertex{Y: 2, X: 1} // フィールドの順番は関係なし
        v2 = Vertex{Y: 2}       // Xはゼロ値(0)をとる
        v3 = Vertex{}           // X: 0, Y: 0
        p = &Vertex{1, 2}       // *Vertex型
    )
    

    array

  • 어레이 길이 지정 및 선언
  • 어레이의 길이는 유형의 일부이므로 어레이의 크기를 변경할 수 없습니다
  • .
    // int型の要素を持つ長さ10の配列の宣言
    var a [10]int
    
    // リテラル
    primes := [6]int{2, 3, 5, 7, 11, 13}
    
    var s [2]string
    s[0] = "Hello"
    s[1] = "World"
    

    slices

  • 유연해진 어레이의 가변 길이 유형
  • a[1:4] 등기법을 통해 배열에서 조각상을 제작할 수 있다
  • 슬라이스는 데이터를 저장하지 않고 원래 정렬된 섹션 열을 나타냅니다
  • .
    primes := [6]int{2, 3, 5, 7, 11, 13}
    
    // int型の要素を持つスライスの宣言
    var s1 []int
    
    // primesの要素のうち、1番目から3番目の要素を含むスライス
    s1 = primes[1:4] // {3, 5, 7}
    
    // 下限と上限の値を省略するとデフォルトの値が使用される
    // デフォルト値は下限: 0, 上限: スライスの長さ
    // 以下は等価
    primes[0:6]
    primes[:6]
    primes[0:]
    primes[:]
    
    // 同じ元となる配列を共有している場合、変更が反映される
    s2 := primes[1:3] // {3, 5}
    s2[0] = 59 // -> primes[1]とs1[0]も59になる
    
    // リテラル
    // [3]{true, true, false}の配列を作成して、それを参照する
    b := []{true, true, false}
    

    길이(length) 및 용량(capacity)

  • 길이: 영화에 포함된 요소수,len 함수를 통해 얻을 수 있다
  • 용량: 픽셀의 첫 번째 요소에서 원시 배열의 요소수,cap 함수로 수출할 수 있음
  • a := [6]int{0, 1, 2, 3, 4, 5}
    
    s1 := a[0:0]  // len(s1) -> 0, cap(s1) -> 6
    s2 := a[0:4]  // len(s2) -> 4, cap(s2) -> 6
    s3 := a[2:6]  // len(s3) -> 2, cap(s3) -> 4
    
    // 容量が十分な場合、スライスを再度スライスすると長さが伸びる
    s4 := s1[0:4] // len(s4) -> 4, cap(s4) -> 6
    
    // スライスのゼロ値はnil、長さと容量は0になる
    var s5 []int  // len(s5) -> 0, cap(s5) -> 0
    

    make 함수


    삽입된make 함수를 사용하여 슬라이스를 만들 수 있습니다
    // 型と長さを引数にとる
    a := make([]int, 2)    // len(a) -> 2, cap(a) -> 2, a: [0 0]
    // 容量も引数に渡すことができる
    b := make([]int, 0, 3) // len(b) -> 0, cap(b) -> 3, b: []
    

    다차원 절편


    슬라이스는 모든 유형을 포함할 수 있으므로 슬라이스를 포함하는 슬라이스를 생성할 수 있습니다.
    board := [][]int{
        []int{1, 2, 3},
        []int{4, 5, 6},
        []int{7, 8, 9},
    }
    

    응용 함수

  • 응용 함수: func append(s []T, vs ...T) []T
  • 슬라이스에 새 요소 추가
  • 응용 시 픽셀의 참조 목적지의 배열 용량을 초과한 경우 반환값이 된 픽셀은 더 큰 사이즈의 배열과 참조를 제작한다
  • var s[]int             // len(s) -> 0, cap(s) -> 0, s: []
    s = append(s, 0)       // len(s) -> 1, cap(s) -> 1, s: [0]
    s = append(s, 1)       // len(s) -> 2, cap(s) -> 2, s: [0 1]
    s = append(s, 2, 3, 4) // len(s) -> 5, cap(s) -> 6, s: [0 1 2 3 4]
    

    map

  • 키와 값을 연결
  • 0은 nil
  • var m map[string]int
    m = make(map[string]int)
    m["likes"] = 10
    m["stocks"] = 5
    
    // リテラル
    m = map[string]int{
        "likes": 10,
        "stocks": 5,
    }
    
    // 追加・更新
    m["foo"] = 1
    
    // 取得
    likes := m["likes]
    
    // 削除
    delete(m, "likes")
    
    // 存在確認、二つ目の戻り値は、値が存在すればtrue、存在しなければfalse
    stocks, ok := m["stocks"]
    

    range

  • 슬라이스나 맵을 순환할 때 사용할 수 있음
  • var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
    
    // ループごとにindexとvalueを返してくれる
    for i, v := range pow {
        fmt.Printf("2**%d = %d\n", i, v)
    }
    
    // 不要な場合はアンダースコアで捨てることができる
    for i, _ := range pow
    for _, value := range pow
    
    // indexだけが欲しい場合は2つ目を省略しても良い
    for i := range pow
    

    옷장

  • 함수는 클론
  • 함수는 외부 참조 변수
  • 에서
    func adder() func(int) int {
        sum := 0
        // sumへの参照を保持した無名関数
        return func(x int) int {
            sum += x
            return sum
        }
    }
    

    다음에 계속!


    다음 내용은...
  • Methods and interfaces
  • Concurrency
  • 참고 자료


    A Tour of Go

    좋은 웹페이지 즐겨찾기