>백엔드 개발 >Golang >Golang 포인터 이해에 대하여

Golang 포인터 이해에 대하여

藏色散人
藏色散人앞으로
2020-11-05 15:36:242040검색

다음 칼럼에서는 golang tutorial 칼럼에서 소개한 Golang 포인터 이해가 필요한 친구들에게 도움이 되길 바랍니다!

Golang 포인터 이해에 대하여

0x00 포인터 주소와 포인터 유형

변수는 해당 변수 유형의 값을 저장하는 메모리 공간에 해당합니다. 포인터의 값은 다른 변수의 주소일 수 있습니다. 임의의 값의 메모리 주소를 가리킵니다.

주소 기호 &를 가져옵니다&
在指针类型前加上 * 号,可以获取指针所指向的内容,它是一个类型更改器,使用一个指针引用一个值称为间接引用。

prt := &v    // v 的类型为T

v 表示被取地址的变量,prt 接收 v 的地址,prt 的类型为 *T,称为 T 的指针类型。

0x01 从指针获取指针指向的值

使用 & 对变量进行取地址之后,获得这个变量的指针,可以对指针使用 * 号来获取这个指针指向的值,称为指针取值。

temp := "test content"
prt := &temp
fmt.Println(*prt)   // 打印 test content

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

对变量进行取地址(&)操作,可以获得这个变量的指针变量。
指针变量的值是指针地址。
对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

0x02 使用指针修改值

使用 * 对指针指向的值进行修改和操作

x, y := 1, 2
fmt.Println(x, y)  // 1 2
j, k := &x, &y
*j, *k = *k, *j
fmt.Println(x, y)  // 2 1

*포인터 유형 앞에 *를 추가하여 포인터가 가리키는 내용을 가져옵니다. 포인터를 사용하여 참조하는 유형 변경자입니다. 값을 간접 참조라고 합니다.

x, y := 1, 2
fmt.Println(x, y)  // 1 2
j, k := &x, &y
j, k = k, j
fmt.Println(x, y)    // 1 2
fmt.Printf("x : %p, y :  %p \n", &x, &y)  // x : 0xc00001a088, y :  0xc00001a090
fmt.Printf("j : %p, y :  %p \n", j, k)  //j : 0xc00001a090, y :  0xc00001a088
v는 주소를 가져온 변수를 나타냅니다. prtv의 주소를 받습니다. >는 T라는 포인터 유형인 *T입니다.

0x01 포인터에서 포인터가 가리키는 값을 가져옵니다

&를 사용하여 변수의 주소를 가져온 후 이 변수의 포인터를 가져올 수 있습니다. >* 포인터에 대한 기호입니다. 이 포인터가 가리키는 값을 얻는 것을 포인터 값 획득이라고 합니다.

var p = f()

func f() *int {
    v := 1
    return &v
}
변수, 포인터 주소, 포인터 변수, 주소, 값의 관계와 특성은 다음과 같습니다.

변수에 대해 주소(&) 연산을 수행하여 이 변수의 포인터 변수를 얻습니다.
포인터 변수의 값은 포인터 주소입니다.

포인터 변수에 값(*) 연산을 수행하여 포인터 변수가 가리키는 원래 변수의 값을 가져옵니다.

0x02 포인터를 사용하여 값 수정 ​​

*를 사용하여 포인터가 가리키는 값을 수정하고 연산합니다

	temp := new(int)
	*temp = 123
	fmt.Println(*temp)  // 123
	fmt.Println(temp)  //  0xaabb

* 기본 의미 연산자는 포인터가 가리키는 변수를 조작하는 것입니다. 작업이 rvalue에 있는 경우에는 가리키는 변수의 값을 사용하고, 작업이 lvalue에 있는 경우에는 해당 값을 가리키는 변수에 설정합니다.

🎜참조된 포인터만 교환하는 경우 참조된 변수, 값 및 주소는 영향을 받지 않고 애플리케이션 포인터만 영향을 받습니다. 🎜
package main

import (
    "flag"
    "fmt"
    "strings"
)

var n = flag.Bool("n", true, "print test")
var sep = flag.String("s", " ", "separator")
var test = flag.String("test", " ", "测试")

func main() {
    flag.Parse()
    fmt.Println(strings.Join(flag.Args(), *sep))
    if *n {
        fmt.Println(*test)
    }
}
🎜 x와 y의 값과 주소는 영향을 받지 않습니다. 포인터 j와 k가 교환된 후에는 j와 k의 값이 교환됩니다. 🎜🎜🎜0x03 함수에서 지역 변수 반환 🎜🎜🎜🎜Go 언어에서는 함수에서 지역 변수의 주소를 반환하는 것도 안전합니다. 예를 들어 다음 코드는 f 함수를 호출할 때 지역 변수 v를 생성합니다. 지역 변수 주소가 반환된 후에도 포인터 p가 여전히 이 변수를 참조하고 있으므로 여전히 유효합니다🎜🎜
$ go run main.go --help
Usage of /var/exe/main:
  -n	print test
  -s string
    	separator (default " ")
  -test string
    	测试 (default " ")
exit status 2
$ go run main.go -s "+"  --test 测试文本 a bc def 123
a+bc+def+123
$ go run main.go -s "+" -n --test 测试文本 a bc def 123
a+bc+def+123
测试文本
🎜🎜0x04 new()를 사용하여 포인터를 만듭니다🎜🎜rrreee🎜🎜0x05 플래그 패키지의 포인터 기술🎜🎜🎜포인터는 표준 라이브러리에서 플래그 패키지를 구현하는 핵심 기술은 명령줄 플래그 구문 분석을 구현하는 데 사용됩니다. 🎜예: 🎜rrreee🎜Run🎜rrreee

위 내용은 Golang 포인터 이해에 대하여의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제