ホームページ  >  記事  >  バックエンド開発  >  Go 言語ポインタの基本を理解するのに役立つ記事

Go 言語ポインタの基本を理解するのに役立つ記事

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 17:27:01965ブラウズ

はじめに

Go 言語は C に似た言語であるため、効率を向上させるために、ポインタはまだ保持されています。

しかし、ポインターに触れたことがない場合は、ポインターの学習についてもっと考える必要があるかもしれません。

ポインターは通常、初心者の手品とも呼ばれます。


##基本的な型ポインタの理解

まず、次の 2 行を見てください。コード。

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

メモリ分布図は次のとおりです。

Go 言語ポインタの基本を理解するのに役立つ記事

これらの 2 行のコードをもう一度見てください。&## が使用されています。ここ ####。

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中,值类型主要有。

intfloatbool 文字列配列struct(構造体)

メモリ配分はおおよそ次のとおりです。

Go 言語ポインタの基本を理解するのに役立つ記事

注: String # のようなものです。 ##、配列構造これらは # # に属します#連続ストレージ 変数が指す は、その 最初のアドレス、残りは長さに基づいて計算されます。

参照型

Go では、主な参照型は次のとおりです。

スライスマップPipeline (chan)

メモリ配分はおおよそ次のとおりです。

Go 言語ポインタの基本を理解するのに役立つ記事


#スタック メモリとヒープ メモリの違い

スタック メモリはストレージ内にあり、 数字文字# などのいくつかの単純なもののみを保存できます。 ##、# 浮動小数点数など ただし、プログラマはスタック メモリによって割り当てられたメモリを再利用する必要はありません。システム自体によって再利用され、パフォーマンスは非常に高くなります。

ヒープ メモリは比較的豊富なストレージです。マップなど、好きなように保存したり、好きなものを詰め込んだりできます。ただし、ヒープ メモリによって割り当てられたメモリは、プログラマが再利用する必要があります。典型的な例: C (言語が GC by # で構成されている場合) ##GCリサイクル、性能は少し劣りますが…でも、人は気ままに保存することができます。 ##############################&#########そして######### *


&

の意味はアドレス文字と呼ばれます。 # は受信アドレス文字と呼ばれます。 ############例######
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。