>백엔드 개발 >Golang >golang에는 포인터가 있습니까?

golang에는 포인터가 있습니까?

青灯夜游
青灯夜游원래의
2022-11-23 10:43:332191검색

golang에는 포인터가 있습니다. Go 언어는 프로그래머에게 데이터 구조 포인터를 제어할 수 있는 기능을 제공합니다. 포인터에 대한 지원은 Java 언어와 C/C++ 언어 사이에 있으며 Java와 같이 포인터를 직접 작동하는 코드의 기능을 취소하지도 않고 문제를 해결하지도 않습니다. C/C++의 포인터 남용으로 인해 발생하는 보안 및 안정성 문제. 포인터는 Go 언어에서 두 가지 핵심 개념으로 나눌 수 있습니다. 1. 이 포인터 유형의 데이터를 수정할 수 있는 유형 포인터 2. 시작 요소를 가리키는 원래 포인터, 요소 수로 구성됨 , 그리고 용량.

golang에는 포인터가 있습니까?

이 튜토리얼의 운영 환경: 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 동영상 튜토리얼]

포인터를 사용하는 방법은 무엇인가요?

포인터를 사용하여 매우 자주 구현되는 몇 가지 중요한 작업이 있습니다.

  • 포인터 변수 정의

  • 변수의 주소를 포인터에 할당

  • 마지막으로 포인터 변수에서 사용 가능한 주소 값에 액세스

이 작업은 단항 연산자 *는 피연산자가 지정한 주소에 있는 변수의 값을 반환합니다. 다음 예제에서는 이러한 작업을 사용합니다. *来返回位于操作数指定的地址的变量的值。下面的例子使用这些操作:

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 */

위 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

rrreee

Go 언어의 nil 포인터 🎜🎜🎜🎜Go 컴파일러는 Nil 포인터에 정확한 주소가 할당되지 않은 경우 값입니다. 이는 변수가 선언될 때 수행됩니다. nil 값으로 지정된 포인터를 nil 포인터라고 합니다. 🎜🎜nil 포인터는 여러 표준 라이브러리에 정의된 0 값을 갖는 상수입니다. 아래 프로그램을 참고하세요. 🎜rrreee🎜 위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다. 🎜rrreee🎜 대부분의 운영체제에서는 프로그램이 0주소의 메모리에 접근하는 것을 허용하지 않습니다. > 왜냐하면 이 메모리는 운영 체제에 의해 예약되어 있기 때문입니다. 그러나 메모리 주소 0에는 특별한 의미가 있습니다. 이는 포인터가 액세스 가능한 메모리 위치를 가리키도록 의도되지 않았음을 나타냅니다. 그러나 관례적으로 포인터에 nil 값이 포함되어 있으면 아무 것도 가리키지 않는 것으로 간주됩니다. 🎜🎜nil 포인터인지 확인하려면 아래와 같이 if 문을 사용할 수 있습니다. 🎜rrreee🎜더 많은 프로그래밍 관련 지식을 보려면 다음 사이트를 방문하세요. 🎜Programming 동영상🎜! ! 🎜

위 내용은 golang에는 포인터가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.