>  기사  >  백엔드 개발  >  Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-24 17:27:011025검색

소개

Go 언어는 C와 유사한 언어이기 때문에 효율성 향상을 위해 포인터가 계속 유지됩니다.

하지만 포인터에 노출된 적이 없다면 포인터를 배우는 것에 대해 더 생각해 봐야 할 수도 있습니다.

포인터는 일반적으로 초보자의 매직 포인터라고도 알려져 있습니다.


기본 유형 포인터의 이해

먼저 이 두 줄의 코드를 살펴보세요.

var n1 int = 666
fmt.Println(n1)//结果:666
fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值

메모리 분포도는 다음과 같습니다.

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

이 두 줄의 코드를 다시 보면 &이 여기에 사용됩니다.

var n1 int = 1
//表示取n1的地址
fmt.Println(&n1)//结果:0xc00000a0b8
fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8

如图所示。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

如果这两个能理解,恭喜你,指针已经会了一半了。


引用类型指针的理解

先看这样的代码。

var studentList = []string{"张三", "李四"}//一个切片
fmt.Println(studentList)        //结果:[张三 李四]
fmt.Printf("%p\n", studentList) //结果:0xc0000044a0
//去地址
fmt.Printf("%p\n", &studentList) //结果:0xc0000044a0

内存分布图如下。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사


值类型和引用类型

值类型

在Go中,值类型主要有。

intintfloatboolstring数组struct(结构体)

内存分布大致如下。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

注:字符串数组结构体floatboolstring경계struct(结构体)


内存分布大致如下。

🎜

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사🎜

🎜🎜注:🎜🎜🎜이미지🎜🎜字符串🎜🎜,🎜🎜경계🎜🎜,🎜🎜结构体🎜🎜这些属于🎜🎜🎜连续存储🎜🎜🎜,🎜🎜🎜变weight指向🎜🎜🎜的是它정말 🎜🎜🎜第一个地址🎜🎜🎜,剩下的会根据长道计算。🎜🎜🎜

참조 유형

Go에서 주요 참조 유형은 다음과 같습니다.

슬라이스切片(slice)map管道(chan) ,

지도,

파이프(chan)Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사


메모리 분포 대략 다음과 같습니다.


스택 메모리와 힙 메모리의 차이점저장 측면에서 스택 메모리는 숫자 , 와 같은 몇 가지 간단한 것만 저장할 수 있습니다. 문자 ,

🎜🎜부동소수점수 등등🎜🎜🎜이지만 스택 메모리에서 할당한 메모리는 프로그래머가 재활용할 필요가 없고 시스템 자체에서 재활용하므로 성능이 매우 높습니다. . 🎜🎜

힙 메모리는 저장 공간이 상대적으로 풍부합니다. 맵처럼 원하는 대로 저장할 수 있지만 힙 메모리에서 할당한 메모리는 프로그래머가 재활용해야 합니다. 글꼴 계열: var(- -monospace); 수직 정렬: 초기; 테두리 너비: 1px; 테두리 스타일: 단색; 테두리 색상: rgb(231, 234, 237); 배경색: rgb(243, 244, 244);border- radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">C++, 언어가 C++,如果语言由GCGC回收,性能稍弱那么一点点点....,但是人家能随便存啊,多随便。


&*的意思

&叫做取地址符。

*GCby

GC재활용하면 성능이 조금 약해집니다... , 하지만 사람들은 마음대로 저장할 수 있습니다. 얼마나 캐주얼합니까.

🎜🎜🎜
🎜🎜

🎜&🎜🎜and🎜🎜*🎜🎜meaning🎜

🎜&🎜🎜를 주소 문자라고 합니다. 🎜🎜

🎜*🎜🎜을 수신 주소 문자라고 합니다. 🎜🎜🎜🎜예🎜🎜

var c *int//*int是一个整体,说明c这个变量只能接收int类型的

*int是一个整体,表示c这个变量只能接收int类型地址

代码

package main


import "fmt"


func main() {
    var c *int
    var d int = 1
    //c = d//错误需要的是d的地址
    c = &d
    fmt.Println(c)
}

执行结果。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

可以看到打印的也是一个地址,但是内存图还是基本类型图。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사

如果要打印c的值,直接*c就好了,取得就是地址里面对应得值了。

fmt.Println(*c)

关于函数

我们一直在强调,操作只会操作上面的,函数同理。

package main


import "fmt"


func say1(x int) {
    //x int 相当于隐藏了一行代码
    //隐藏的代码时 var x int = x,一定要记住这个
    fmt.Printf("say1:%p\n", x)
}
func say2(x *int) {
    //隐藏的代码是 var x *int = x,x是一个地址
    fmt.Printf("say2:%p\n", x)
}
func say3(x []int) {
    //隐藏的代码是 var x []int = x,因为x是引用类型,所以x是一个地址
    fmt.Printf("say3:%p\n", x)
}
func main() {
    say1(1)//栈上面是1,所以传进去就是1
    var x1 = 1
    say2(&x1)//say只能接收整数地址
    var x2 = []int{1, 1}
    say3(x2)//x2是引用类型,所以传进去的时候就是地址,栈上面的就是地址
}

执行结果。

Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사


总结

上述我们主要讲述了基本类型指针引用类型指针,也叫做值类型引用类型,并且画出了值类型引用类型内存的本质区分图,后来又讲了&*的区别,还有函数传参的本质是什么,希望对大家的学习有帮助。

위 내용은 Go 언어 포인터의 기본을 이해하는 데 도움이 되는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제