그럼 왜 Golang에 포인터가 필요한가요? 이런 종류의 포인터는 어떤 독특한 용도로 사용될 수 있나요? #推荐#(추천 학습:GO)#🎜🎜 ## 🎜🎜#인용형 언어를 학습할 때 매개변수 매개변수를 전달하는 함수/메소드가 주어지면 항상 먼저 파악하세요. 언제, 무엇을 값 또는 참조가 전달됩니다.
사실 대부분의 참조 언어에서 매개변수가 기본 유형일 때 전달되는 대부분의 값은 값입니다. 이는 매개변수의 또 다른 복사본이 현재 함수 호출 스택에 복사된다는 의미입니다. 매개변수가 고급 유형인 경우 기본적으로 모든 참조가 전달됩니다. 이는 주로 가상 머신의 메모리 관리로 인해 발생합니다. 메모리 관리에서 메모리 영역에는 일반적으로 힙과 스택이 포함됩니다. 스택은 주로 현재 호출 스택에서 사용되는 간단한 유형의 데이터(string, boolean, int, float 등)를 저장하는 데 사용됩니다. 이러한 유형의 메모리는 차지하는 양이 적고 재활용이 쉽습니다. 기본적으로 해당 값은 포인터가 차지하는 공간과 유사하므로 직접 복사할 수 있으며 더 쉽습니다. GC가 타겟 최적화를 수행하도록 합니다.복잡한 고급 유형은 비교적 많은 양의 메모리를 차지하는 경향이 있으며 GC 재활용 빈도는 상대적으로 낮고 비용이 높으므로 참조/포인터 전달을 피할 수 있습니다. 비용 증가, 복사 작업 증가, 메모리 절약 및 프로그램 실행 효율성 향상.
따라서 다음과 같은 상황에서는 포인터 사용을 고려할 수 있습니다. 1. 매개변수 값을 변경해야 하는 경우 2. 복사 작업을 피하는 경우
그리고 Golang에서는 구체적인 고급 유형인 struct, Slice, Map도 다릅니다. 사실 struct의 사용법만 조금 복잡합니다. Slice, map, chan은 모두 값인지 포인터인지 고려하지 않고 바로 사용할 수 있습니다.Go에는 포인터가 있지만 포인터 연산은 없습니다. 포인터 변수를 사용하여 문자열의 개별 바이트를 반복할 수는 없습니다. Go에서 함수를 호출할 때 변수는 값으로 전달된다는 점을 기억하세요.
포인터 ' * '에 var p * int 유형을 접두어로 붙여 정의합니다. 이제 p는 정수 값에 대한 포인터입니다. 새로 정의된 모든 변수에는 해당 유형의 0 값이 할당되며 포인터에도 마찬가지입니다. 아무것도 가리키지 않는 새로 정의된 포인터는 nil 값을 갖습니다.
다른 언어에서는 이를 종종 NULL 포인터라고 부르는데 Go에서는 nil입니다. 포인터가 무언가를 가리키도록 하려면 다음과 같이 주소 연산자(&)를 사용할 수 있습니다.package main import "fmt" func main() { var p *int fmt.Printf("%v\n",p) //← 打印 nil var i int //← 定义一个整形变量 i p = &i //← 使得 p 指向 i, 获取 i 的地址 fmt.Printf("%v\n",p) //打印内存地址 *p = 6 fmt.Printf("%v\n",*p) //打印6 fmt.Printf("%v\n",i) //打印6 }앞서 언급했듯이 포인터 연산이 없으므로 다음과 같이 작성하면: *p++, 이는 (* p)++를 의미합니다. 먼저 포인터가 가리키는 값을 가져온 다음 이 값에 1을 추가합니다. 여기서 C 언어와의 차이점에 주목하세요. Go 언어의 경우 엄밀히 말하면 값에 따른 전송 유형은 한 가지뿐입니다. 변수가 매개변수로 전달되면 변수의 복사본이 생성된 후 함수나 메서드에 전달되는 것을 볼 수 있습니다. 이 복사본의 주소는 변수의 주소와 다릅니다. 변수가 포인터로 전달되면 해당 변수가 가리키는 동일한 메모리 주소를 가리키는 새 포인터가 생성되므로 이 포인터를 원래 변수 포인터의 복사본으로 생각하면 됩니다. . 이렇게 이해하면 Go는 항상 복사본을 생성하여 값으로 전달한다고 이해할 수 있는데, 이 복사본은 변수의 복사본일 때도 있고, 변수 포인터의 복사본일 때도 있습니다. .
위 내용은 GOLANG에 여전히 포인터가 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!