golang에는 포인터가 있습니다. Go 언어는 프로그래머에게 데이터 구조 포인터를 제어할 수 있는 기능을 제공합니다. 포인터에 대한 지원은 Java 언어와 C/C++ 언어 사이에 있으며 Java와 같이 포인터를 직접 작동하는 코드의 기능을 취소하지도 않고 문제를 해결하지도 않습니다. C/C++의 포인터 남용으로 인해 발생하는 보안 및 안정성 문제. 포인터는 Go 언어에서 두 가지 핵심 개념으로 나눌 수 있습니다. 1. 이 포인터 유형의 데이터를 수정할 수 있는 유형 포인터 2. 시작 요소를 가리키는 원래 포인터, 요소 수로 구성됨 , 그리고 용량.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
Java 및 .NET과 같은 프로그래밍 언어와 달리 Go 언어는 프로그래머에게 데이터 구조 포인터를 제어할 수 있는 기능을 제공하지만 포인터 작업을 수행할 수는 없습니다. Go 언어를 사용하면 특정 컬렉션의 데이터 구조, 할당 수 및 메모리 액세스 패턴을 제어할 수 있으며 이는 제대로 작동하는 시스템을 구축하는 데 매우 중요합니다. 포인터가 성능에 미치는 영향은 자명합니다. 시스템 프로그래밍, 운영 체제 또는 네트워크 응용 프로그램을 수행하려면 포인터가 없어서는 안될 부분입니다.
Go 언어의 포인터 지원은 Java 언어와 C/C++ 언어 사이에 있습니다. 이는 Java처럼 포인터를 직접 작동하는 코드의 기능을 취소하지도 않고 C/C++에서 포인터의 남용을 방지하지도 않습니다. 신뢰성 문제.
포인터(포인터)는 Go 언어에서 두 가지 핵심 개념으로 나눌 수 있습니다.
포인터 유형은 이 포인터 유형의 데이터를 복사하지 않고도 데이터를 직접 전송할 수 있습니다. , 유형 포인터는 오프셋 및 연산을 수행할 수 없습니다.
슬라이스는 시작 요소에 대한 원시 포인터, 요소 수 및 용량으로 구성됩니다.
이러한 제약과 분할의 이점을 활용하여 Go 언어의 포인터 유형 변수는 포인터 오프셋 없이 효율적인 포인터 액세스 특성을 가지므로 중요한 데이터의 불법 수정 문제를 피할 수 있습니다. 동시에 가비지 수집을 사용하면 오프셋되지 않는 포인터를 더 쉽게 검색하고 재활용할 수 있습니다.
슬라이스에는 원시 포인터보다 더 강력한 기능이 있으며 더 안전합니다. 조각이 경계를 벗어나면 런타임은 충돌을 보고하고 스택을 팝업하지만 원래 포인터는 축소만 됩니다.
golang의 포인터란 무엇인가요?
포인터는 값이 다른 변수의 주소, 즉 메모리 위치의 직접 주소인 변수입니다. 변수나 상수와 마찬가지로 포인터는 변수의 주소를 저장하는 데 사용되기 전에 선언되어야 합니다. 포인터 변수 선언의 일반적인 형식은 다음과 같습니다.
var var-name *var-type
여기서 var-type은 포인터의 기본 유형이고 유효한 Go 데이터 유형이어야 하며 var-name은 포인터 변수의 이름입니다. 포인터를 선언하는 데 사용되는 별표(*)는 곱셈에 사용되는 별표와 동일합니다. 그러나 이 명령문에서는 별표(*)를 사용하여 변수를 포인터로 지정합니다. 다음은 유효한 포인터 선언입니다.
var ip *int /* pointer to an integer */ var fp *float32 /* pointer to a float */
모든 포인터 값(정수, 부동 소수점 또는 기타 데이터 유형)의 실제 데이터 유형은 동일하며 메모리 주소를 나타내는 긴 16진수입니다. 다양한 데이터 유형의 포인터 간의 유일한 차이점은 포인터가 가리키는 변수 또는 상수의 데이터 유형입니다. [관련 추천: Go 동영상 튜토리얼]
포인터를 사용하는 방법은 무엇인가요?
포인터를 사용하여 매우 자주 구현되는 몇 가지 중요한 작업이 있습니다.
포인터 변수 정의
변수의 주소를 포인터에 할당
마지막으로 포인터 변수에서 사용 가능한 주소 값에 액세스
이 작업은 단항 연산자 <를 사용하여 수행됩니다. code>*< /code>는 피연산자가 지정한 주소에 있는 변수의 값을 반환합니다. 다음 예제에서는 이러한 작업을 사용합니다. *
来返回位于操作数指定的地址的变量的值。下面的例子使用这些操作:
package main import "fmt" func main() { var a int= 20 /* actual variable declaration */ var ip *int /* pointer variable declaration */ ip = &a /* store address of a in pointer variable*/ fmt.Printf("Address of a variable: %x\n", &a ) /* address stored in pointer variable */ fmt.Printf("Address stored in ip variable: %x\n", ip ) /* access the value using the pointer */ fmt.Printf("Value of *ip variable: %d\n", *ip ) }
当上面的代码编译和执行时,它产生结果如下:
Address of var variable: 10328000 Address stored in ip variable: 10328000 Value of *ip variable: 20
在Go语言中的nil指针
Go编译器为指针变量分配一个Nil
值,以防指针没有确切的地址分配。这是在变量声明的时候完成的。指定为nil
值的指针称为nil指针。
nil
指针是在几个标准库中定义的值为零的常量。参考下面的程序:
package main import "fmt" func main() { var ptr *int fmt.Printf("The value of ptr is : %x\n", ptr ) }
当上面的代码编译和执行时,它产生结果如下:
The value of ptr is 0
在大多数操作系统上,程序不允许访问地址0
处的内存,因为该内存是由操作系统保留的。 然而,存储器地址0
具有特殊意义;它表示指针不打算指向可访问的存储器位置。但是按照惯例,如果指针包含nil
(零)值,则假设它不指向任何东西。
要检查是否为nil
指针,可以使用if
if(ptr != nil) /* succeeds if p is not nil */ if(ptr == nil) /* succeeds if p is null */
nil
값으로 지정된 포인터를 nil 포인터라고 합니다. 🎜🎜nil
포인터는 여러 표준 라이브러리에 정의된 0 값을 갖는 상수입니다. 아래 프로그램을 참고하세요. 🎜rrreee🎜 위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다. 🎜rrreee🎜 대부분의 운영체제에서는 프로그램이 0
주소의 메모리에 접근하는 것을 허용하지 않습니다. > 왜냐하면 이 메모리는 운영 체제에 의해 예약되어 있기 때문입니다. 그러나 메모리 주소 0
에는 특별한 의미가 있습니다. 이는 포인터가 액세스 가능한 메모리 위치를 가리키도록 의도되지 않았음을 나타냅니다. 그러나 관례적으로 포인터에 nil 값이 포함되어 있으면 아무 것도 가리키지 않는 것으로 간주됩니다. 🎜🎜nil
포인터인지 확인하려면 아래와 같이 if
문을 사용할 수 있습니다. 🎜rrreee🎜더 많은 프로그래밍 관련 지식을 보려면 다음 사이트를 방문하세요. 🎜Programming 동영상🎜! ! 🎜위 내용은 golang에는 포인터가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!