Go 언어는 C와 유사한 언어이기 때문에 효율성 향상을 위해 포인터가 계속 유지됩니다.
하지만 포인터에 노출된 적이 없다면 포인터를 배우는 것에 대해 더 생각해 봐야 할 수도 있습니다.
포인터는 일반적으로 초보자의 매직 포인터라고도 알려져 있습니다.
먼저 이 두 줄의 코드를 살펴보세요.
var n1 int = 666 fmt.Println(n1)//结果:666 fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值
메모리 분포도는 다음과 같습니다.
이 두 줄의 코드를 다시 보면 &
이 여기에 사용됩니다.
var n1 int = 1 //表示取n1的地址 fmt.Println(&n1)//结果:0xc00000a0b8 fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8
如图所示。
如果这两个能理解,恭喜你,指针已经会了一半了。
先看这样的代码。
var studentList = []string{"张三", "李四"}//一个切片 fmt.Println(studentList) //结果:[张三 李四] fmt.Printf("%p\n", studentList) //结果:0xc0000044a0 //去地址 fmt.Printf("%p\n", &studentList) //结果:0xc0000044a0
内存分布图如下。
在Go中,值类型主要有。
int
int
,float
,bool
,string
,数组
,struct(结构体)
内存分布大致如下。
注:像字符串
,数组
,结构体
,float,bool
,string
,경계
,struct(结构体)
内存分布大致如下。
🎜
🎜🎜注:🎜🎜🎜이미지🎜🎜字符串
🎜🎜,🎜🎜경계
🎜🎜,🎜🎜结构体
🎜🎜这些属于🎜🎜🎜连续存储🎜🎜🎜,🎜🎜🎜变weight指向🎜🎜🎜的是它정말 🎜🎜🎜第一个地址🎜🎜🎜,剩下的会根据长道计算。🎜🎜🎜
Go에서 주요 참조 유형은 다음과 같습니다.
슬라이스
切片(slice)
,map
,管道(chan)
,
지도
,
파이프(chan)
메모리 분포 대략 다음과 같습니다.
스택 메모리와 힙 메모리의 차이점저장 측면에서 스택 메모리는 숫자 , 와 같은 몇 가지 간단한 것만 저장할 수 있습니다. 문자 ,
🎜🎜부동소수점수 등등🎜🎜🎜이지만 스택 메모리에서 할당한 메모리는 프로그래머가 재활용할 필요가 없고 시스템 자체에서 재활용하므로 성능이 매우 높습니다. . 🎜🎜힙 메모리는 저장 공간이 상대적으로 풍부합니다. 맵처럼 원하는 대로 저장할 수 있지만 힙 메모리에서 할당한 메모리는 프로그래머가 재활용해야 합니다. 글꼴 계열: 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++
,如果语言由GC
由GC
回收,性能稍弱那么一点点点....,但是人家能随便存啊,多随便。
&
和*
的意思
&
叫做取地址符。
*
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) }
执行结果。
可以看到打印的也是一个地址,但是内存图还是基本类型图。
如果要打印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 언어 포인터의 기본을 이해하는 데 도움이 되는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!