그럼 왜 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 }
위 내용은 GOLANG에 여전히 포인터가 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!