골랑 포인터

3213 단어 go
우리는 모든 변수가 메모리에 위치를 가지고 있다는 것을 알고 있습니다. Go에서 포인터는 다른 변수의 메모리 주소를 저장하는 데 사용되는 특수 변수입니다. 포인터를 사용하면 해당 메모리 주소에 저장할 수도 있고 검색할 수도 있습니다.
포인터를 사용하는 방법에는 두 가지가 있습니다.
  • * 연산자는 포인터 변수를 선언하는 데 사용되는 역참조 연산자라고도 하며 access the value 주소에 저장됩니다.
  • & 연산자를 주소 연산자used to return the memory address of a variable라고 하거나 포인터에 대한 변수의 주소에 액세스합니다.

  • 책 유추: 포인터를 실질적으로 이해하는 데 도움을 주기 위해


    우리가 이것을 더 잘 이해할 수 있도록 책의 비유를 사용합시다. 책에는 페이지가 있고 각 페이지에는 페이지 번호가 있으며 각 페이지에는 고유한 내용이 있습니다. 특정 콘텐츠를 원하고 페이지 번호와 해당 페이지의 콘텐츠를 알고 있는 경우 페이지 번호로 찾는 것이 더 쉬울까요? 아니면 책에서 해당 콘텐츠를 찾는 것이 더 쉬울까요? 내 생각에 페이지 번호로 콘텐츠를 찾는 것이 더 쉽고 빠를 것입니다. 마찬가지로 포인터가 이동 중에 사용되는 것입니다. & 연산자는 generate a page number , *Operator would tell you the content on a given page number 입니다.

    package main
    
    import "fmt"
    
    func main() {
        i, j := 42, 2701
    
        p := &i         // point to i
        fmt.Println(*p) // read i through the pointer
        *p = 21         // set i through the pointer
        fmt.Println(i)  // see the new value of i
    
        p = &j         // point to j
        *p = *p / 37   // divide j through the pointer
        fmt.Println(j) // see the new value of j
    }
    
    


    포인터가 필요한 이유는 무엇입니까?

    1960년대에 포인터는 프로그래머에게 변수의 메모리 위치를 전달한 다음 필요에 따라 조작을 위해 역참조하는 방법을 제공했습니다. 이것은 더 적은 메모리를 소비하면서 더 복잡한 데이터 구조를 생성하는 방법을 제공했습니다. Harold Lawson은 포인터를 발명한 것으로 알려져 있습니다.

    전달할 필요가 있을 때마다 많은 양의 데이터를 복사하는 대신 프로그래머가 해당 주소를 전달할 수 있습니다. 책의 비유로 돌아가면 전체 페이지보다 페이지 번호를 함수에 전달하는 것이 더 쉽습니다.

    Go에서는 모든 것이 값으로 전달됩니다. 함수에 무언가를 전달할 때마다 함수는 값을 얻지만 원래 객체에 액세스할 수 없습니다. Go 플레이그라운드에서 다음 코드를 입력하여 내가 의미하는 바를 확인하세요!

    package main
    
    import (
        "fmt"
    )
    
    type Celebrity struct {
        Name     string
        Vehicles []string
    }
    
    func (c Celebrity) newVehicle() {
        c.Vehicles = append(c.Vehicles, "Ferari")
        fmt.Println(c)
    }
    
    func main() {
        c := Celebrity{Name: "Christiano Ronaldo", Vehicles: []string{"Rolls Royce"}}
        c.newVehicle() // {Christiano Ronaldo [Rolls Royce Ferari]} -- the celebrity with a new Vehicle, Ferari!
        fmt.Println(c) // Hey, wait! Where did the Ferari go?
    }
    
    


    왜 우리가 이 결과를 얻었습니까?
    Celebrity 값을 newVehicle()에 전달하고 새 차량을 추가했습니다. 우리는 여전히 원래 Celebrity를 ​​변경(또는 돌연변이)하지 않았습니다.

    해결책:

    package main
    
    import (
        "fmt"
    )
    
    type Celebrity struct {
        Name     string
        Vehicles []string
    }
    
    func (p *Celebrity) newVehicle() {
        p.Vehicles = append(p.Vehicles, "Ferari")
        fmt.Println(*p)
    }
    
    func main() {
        c := Celebrity{Name: "Christiano Ronaldo", Vehicles: []string{"Rolls Royce"}}
        p := &c // Let's make a pointer to celebrity!
        p.newVehicle()
        fmt.Println(c)
    }
    
    // Does Christiano have a new vehicle now? Yes!
    
    


    처음에는 포인터를 이해하는 것이 어려웠습니다. 연습은 저를 더 잘 만들었습니다. 따라서 포인터를 이해하는 데 문제가 있어도 괜찮습니다. 휴식을 취하고 계속 학습하십시오.

    좋은 웹페이지 즐겨찾기