Go 30일: 포인터와 구조체

10488 단어 beginnersgodevjournal

학습 업데이트



이 게시물은 Golang 여행 30일 중 4일, 5일, 6일을 다룹니다. 때때로 삶이 방해가 되기 때문에 많은 것을 다룰 수 없었습니다. 내가 다룰 수 있었던 것은 꽤 중요했습니다. 응용 프로그램을 만들기 전에 필요한 마지막 단계였습니다.

다음은 Go의 포인터와 구조체에 대한 제 노트입니다.

포인터



Go 포인터를 사용하면 프로그램 내의 값에 대한 참조를 전달할 수 있습니다. 이에 대한 예는 다음과 같습니다.

package main

import "fmt"

// This is a regular function in Go
// It has a regular integer argument
func nonPointerFunc(val int) {
    val = 0
}

// This function takes a pointer as an argument
// This is denoted by the *int, this means pval is a pointer to an integer value
func pointerFunc(pval *int) {
    // The * infront of pval dereferences the pointer so that we can work with the
    // value that the pointer references
    *pval = 0
}

func main() {
    // Initialize a value
    x := 1
    // Pass the value to nonPointerFunc
    nonPointerFunc(x)
    // After execution print the value of x and you will find it is 1
    fmt.Println("Value after non pointer function: ", x)

    // Pass a pointer to x into pointerFunc
    // To get a pointer to a function use the syntax &value
    // &x is the pointer for x
    pointerFunc(&x)
    // Print x after the execution and you will get a value of 0
    fmt.Println("Value after pointer function:", x)

    // To see the pointer itself you can print it out this way.
    fmt.Println("Pointer ", &x)
}


포인터를 더 잘 이해하기 위해 나는 . 그녀는 포인터가 어떻게 작동하는지 설명하기 위해 Golang의 스택과 힙을 설명합니다. 다음은 내 이해를 바탕으로 얻은 테이크 아웃입니다.
  • Go 함수에 인수를 전달할 때(예: 기본 함수에서 함수 호출) Go는 그것의 복사본을 만들고 그 복사본은 호출된 함수 내에서 계산에 사용될 것입니다. main에서 전달된 변수는 변경되지 않은 상태로 유지됩니다.
  • 값의 포인터를 함수에 전달하면 값의 복사본이 생성되지 않습니다. 포인터가 참조하는 값은 함수에 의해 수정될 값입니다.
  • 포인터를 사용하면 변수의 복사본을 만들지 않기 때문에 더 효율적입니다. 포인터를 사용함으로써 우리는 효율성을 위해 불변성을 포기하고 있습니다. 이것을 더 잘 이해하기 위해 더 많은 조사를 하고 이에 대한 블로그 게시물을 작성하겠습니다.

  • 구조체



    구조체는 유형이 지정된 필드 모음입니다. Go는 구조체를 사용하여 데이터를 그룹화하여 레코드를 형성합니다.

    구조체 만들기

    type macbook struct {
        model string
        price int
    }
    
    // creating a variable with the struct
    air = macbook{"M1 air 8gb", 1000}
    pro = macbook{model: "M1 pro 32gb", price:2000}
    // Fields that have been ommitted will be zero-valued
    proMax = macbook{price: 3500}
    
    // struct fields can be accessed with a dot
    fmt.Println(pro.model)
    
    // dots can also be used with a struct pointer, the pointer will be automatically
    // dereferenced
    // Note that structs are mutable so updating the pointer will also update the initial value
    
    sp := &air
    fmt.Println(sp.price)
    


    더 관용적인 Go 생성자 함수를 작성하기 위해 새 구조체를 만드는 데 사용됩니다.

    func newMacbook(model string, price int) *macbook {
        m := macbook{model: model, price: price}
        m.price = 1000
        return &m
    }
    


  • 지역 변수의 포인터를 반환하는 것은 함수 범위에서 살아남기 때문에 허용됩니다.
    이 생성자 함수를 사용하기 위해 다음 코드 줄을 작성합니다.
  • 이 유형의 생성자 함수를 사용하여 스택 및 힙 할당에 대해 더 읽어야 합니다.

  • mini = newMacbook("M1 mini 8gb", 700)
    fmt.Println(mini)
    


    행동 양식



    Go는 구조체 유형에 대한 메소드를 허용합니다. 이러한 메서드는 다음과 같이 정의됩니다.

    type rect struct {
        width, height int
    }
    
    // golang methods can have pointer recivers
    func (r *rect) area() int {
        return r.width * r.height
    }
    
    // golang methods can have value recivers
    func (r rect) perim() int {
        return 2*r.width + 2*r.height
    }
    
    func main() {
        r := rect{width: 20, height: 10}
    
        // Go automatically handles conversion between values and pointers for method calls.
        rp := &r
        fmt.Prinln("area: ", rp.area())
    }
    


    메서드 호출 시 복사를 방지하기 위해 포인터 수신기 유형을 사용할 수 있습니다. 또한 메소드가 수신 구조체를 변경하도록 허용합니다.

    다음은



    나는 꽤 많은 기본 사항을 살펴 보았고 이제 실제로 무언가를 만들어서 배우고 싶습니다. 가장 먼저 할 일은 gophercises 웹사이트에서 하나를 실행하는 것입니다. 연습은 퀴즈 게임을 만드는 것입니다. 게임은 CSV에서 질문과 답변을 읽고 사용자가 터미널에서 답변할 수 있도록 합니다.

    앞으로 며칠 동안 이 건물을 문서화할 것입니다.

    좋은 웹페이지 즐겨찾기