Go lang - 11 : 포인터 2
포인터, Pointer ?
포인터에 대해 어느정도 알고 있다고 가정하고 생략하며 진행한다.
일단 핵심은 변수가 저장된 메모리의 [주소 값] 을 활용하는 것이다.
주로 외부에서 변수를 수정하는 경우 사용한다.
올바른 포인터의 사용은 프로그램을 더 효율적이고
더 빠르게 만들어준다.
일단 문법을 살펴보면 다음과 같다
package main
import "fmt"
func main() {
x := 3000
y := "만큼 사랑해!"
pointerX := &x // 주소값
pointerY := &y
fmt.Println(pointerX)
fmt.Println(pointerY)
fmt.Println(*pointerX) // 역 참조
fmt.Println(*pointerY)
}
일단 Go 의 포인터 구문은 C/C++ 과 거의 같다
& : 메모리 주소 반환
* : 주소 값을 역으로 참조해서 메모리를 찾고 안에 값을 반환
포인터에 대한 쉬운 자료는 엄청 많다 (검색해보자)
여기서 차별점은 가비지 컬렉터도 사용하기 때문에 메모리 관리도 편리하다
또 빈 포인터는 nil로 초기화된다
포인터를 통해 업데이트
package main
import "fmt"
func update(i *int) {
*i = 20
}
func main() {
x := 3000
y := "만큼 사랑해!"
pointerX := &x // 주소값
pointerY := &y
update(pointerX)
fmt.Println(pointerX)
fmt.Println(pointerY)
fmt.Println(*pointerX) // 역 참조
fmt.Println(*pointerY)
}
package main
import "fmt"
func update(i *int) {
*i = 20
}
func main() {
x := 3000
y := "만큼 사랑해!"
pointerX := &x // 주소값
pointerY := &y
update(pointerX)
fmt.Println(pointerX)
fmt.Println(pointerY)
fmt.Println(*pointerX) // 역 참조
fmt.Println(*pointerY)
}
update func 에서 pointerX가 가진 주소값을 복사했고
복사한 주소값이 가진 값을 역참조하고 값을 바꾼 것이다
이런 코드는 데이터 흐름이 복잡해질 수 있어 주의가 필요하다.
이는 가비지 컬렉터 성능과 관련있다
변수 수정을 위한 포인터 사용이 불가피 한 경우는
함수가 해당 포인터를 인터페이스로 예상할 때 뿐이라고 한다
이유는 제네릭이 아직 없기 때문이다.
그럼에도 성능개선을 위한 이점이 많다
추후 알고리즘 관련 포스팅에서 성능 차이를 확인해보자
Author And Source
이 문제에 관하여(Go lang - 11 : 포인터 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@phoenix/Go-lang-11-포인터-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)