골랑 포인터
3213 단어 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!
처음에는 포인터를 이해하는 것이 어려웠습니다. 연습은 저를 더 잘 만들었습니다. 따라서 포인터를 이해하는 데 문제가 있어도 괜찮습니다. 휴식을 취하고 계속 학습하십시오.
Reference
이 문제에 관하여(골랑 포인터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bazeng/golang-pointers-3bmc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)