目次
はじめに" >はじめに
引用类型指针的理解" >引用类型指针的理解
值类型和引用类型
" >值类型和引用类型
值类型" >值类型
参照型" >参照型

" >#スタック メモリとヒープ メモリの違い
关于函数
" >关于函数
ホームページ バックエンド開発 Golang Go 言語ポインタの基本を理解するのに役立つ記事

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

Jul 24, 2023 pm 05:27 PM
言語を移動

はじめに

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? Apr 02, 2025 pm 04:09 PM

GOのマップイテレーションにより、すべての値が最後の要素になるのはなぜですか? Go言語では、いくつかのインタビューの質問に直面したとき、あなたはしばしば地図に遭遇します...

See all articles