検索
ホームページバックエンド開発Python チュートリアルGo 言語の比較 C++ 参照パラメータの受け渡し

Go 言語の比較 C++ 参照パラメータの受け渡し

Sep 02, 2017 am 11:16 AM
比較した引用言語

この記事では、Go に参照によるパラメータ受け渡しがあるかどうか (C++ と比較して) を主に紹介します。必要な場合は、

C++ の 3 つのパラメータ受け渡しメソッドを参照してください。パラメーターを渡す方法。関数の仮パラメーターは実際のパラメーターのコピーです。関数内で仮パラメーターを変更しても、関数の外部の仮パラメーターには影響しません。一般に、値の受け渡しは、呼び出し元に影響を与えずに関数内のパラメーターを変更する場合に使用されます。 ポインタ渡し

仮引数は、その名の通り、実引数のアドレスを指すポインタであり、関数内で仮引数が指す内容を操作すると、実引数そのものが変更されます。 。

参照渡し

C++ では、参照は変数のエイリアスであり、実際には同じものであり、メモリ内の同じアドレスにも存在します。言い換えれば、参照が操作される場合はどこでも、参照される変数はまったく直接操作されます。

以下のデモを見てください:

#include <iostream>
//值传递
void func1(int a) {
  std::cout << "值传递,变量地址:" << &a << ", 变量值:" << a << std::endl;
  a ++ ;
}
//指针传递
void func2 (int* a) {
  std::cout << "指针传递,变量地址:" << a << ", 变量值:" << *a << std::endl;
  *a = *a + 1;
}
//引用传递
void func3 (int& a) {
  std::cout << "指针传递,变量地址:" << &a << ", 变量值:" << a << std::endl;
  a ++;
}
int main() {
  int a = 5;
  std::cout << "变量实际地址:" << &a << ", 变量值:" << a << std::endl;
  func1(a);
  std::cout << "值传递操作后,变量值:" << a << std::endl;
  std::cout << "变量实际地址:" << &a << ", 变量值:" << a << std::endl;
  func2(&a);
  std::cout << "指针传递操作后,变量值:" << a << std::endl;
  std::cout << "变量实际地址:" << &a << ", 变量值:" << a << std::endl;
  func3(a);
  std::cout << "引用传递操作后,变量值:" << a << std::endl;
  return 0;
}
出力結果は次のとおりです:

変数の実アドレス: 0x28feac、変数値: 5

値の転送、変数アドレス: 0x28fe90、変数値: 5

値の後転送操作、変数値: 5

変数の実際のアドレス: 0x28feac、変数値: 5

ポインター転送、変数アドレス: 0x28feac、変数値: 5
ポインター転送操作後、変数値: 6

変数の実際のアドレス: 0x28feac 、変数値: 6

ポインタ転送、変数アドレス: 0x28feac、変数値: 6

参照転送操作後、変数値: 7





Goでのパラメータの受け渡し



以上、3つのパラメータの受け渡し方法を紹介しました。 C++、値の受け渡しとポインターの受け渡しは簡単だと理解していますが、Go にもこれらのパラメーターの受け渡しメソッドはありますか?これは議論を引き起こしましたが、C++ の参照受け渡しの概念と比較すると、Go には参照受け渡しのメソッドが存在しないと言えます。なぜこんなことを言うのかというと、Go には変数参照の概念がないからです。ただし、Go には参照型があり、これについては後で説明します。

まず Go で値とポインタを渡す例を見てみましょう:

package main
import (
  "fmt"
)
func main() {
  a := 1
  fmt.Println( "变量实际地址:", &a, "变量值:", a)
  func1 (a)
  fmt.Println( "值传递操作后,变量值:", a)
  fmt.Println( "变量实际地址:", &a, "变量值:", a)
  func2(&a)
  fmt.Println( "指针传递操作后,变量值:", a)
}
//值传递
func func1 (a int) {
  a++
  fmt.Println( "值传递,变量地址:", &a, "变量值:", a)
}
//指针传递
func func2 (a *int) {
  *a = *a + 1
  fmt.Println( "指针传递,变量地址:", a, "变量值:", *a)
}
出力結果は次のとおりです:

変数の実際のアドレス: 0xc04203c1d0 変数値: 1

値の転送、変数アドレス: 0xc04203c210 変数値: 2

値転送 演算後、変数値: 1

変数実アドレス: 0xc04203c1d0 変数値: 1

ポインタ転送、変数アドレス: 0xc04203c1d0 変数値: 2
ポインタ転送演算後、変数値: 2

とすることができます。 Go の基本型は値によって渡されることがわかりました。ポインターの受け渡しは C++ と変わりませんが、変数参照の概念がありません。では、Go の参照型をどのように理解すればよいでしょうか?


Go の参照型



Go では、参照型にはスライス、辞書、チャネルなどが含まれます。スライスを例に挙げます。スライスを渡すことは参照ですか?

例:

package main
import (
  "fmt"
)
func main() {
  m1 := make([]string, 1)
  m1[0] = "test"
  fmt.Println("调用 func1 前 m1 值:", m1)
  func1(m1)
  fmt.Println("调用 func1 后 m1 值:", m1)
}
func func1 (a []string) {
  a[0] = "val1"
  fmt.Println("func1中:", a)
}
出力結果は次のとおりです:

func1 を呼び出す前の m1 の値: [test]

func1 内: [val1]

func1 を呼び出した後の m1 の値: [ val1]

関数内 スライスに加えられた変更は、実際のパラメータ値に影響します。これは参照渡しであることを意味しますか?

実際にはそうではありません。この質問に答えるには、まず呼び出し元の関数スライス m1 が変更されたかどうかを確認する必要があります。まず、スライスの性質を理解する必要があります。

スライスは配列フラグメントの説明です。これには、配列へのポインタ、フラグメントの長さが含まれます。

言い換えると、上で出力したものはスライスそのものではなく、スライスが指す配列です。別の例として、スライスが変更されたかどうかを確認します。

  package main
import (
  "fmt"
)
func main() {
  m1 := make([]string, 1)
  m1[0] = "test"
  fmt.Println("调用 func1 前 m1 值:", m1, cap(m1))
  func1(m1)
  fmt.Println("调用 func1 后 m1 值:", m1, cap(m1))
}
func func1 (a []string) {
  a = append(a, "val1")
  fmt.Println("func1中:", a, cap(a))
}

出力結果は以下の通りです。

func1を呼び出す前のm1の値: [test] 1

func1の場合: [test val1] 2

func1を呼び出した後のm1の値: [test] 1

この結果は、呼び出しの前後でスライスが変化していないことを示しています。前の例のいわゆる「変更」は、実際には、スライス内の配列へのポインタが指す配列の要素が変更されたことを意味します。この文は少しぎこちないかもしれませんが、実際にはそうです。参照型のパラメーター受け渡しが参照渡しではないことをもう一度証明します。

スライスとは配列の断片の説明です。これには、配列へのポインタとフラグメントの長さが含まれています。興味がある場合は、この記事を参照してください: http://www.jb51.net/kf/201604/499045.html。スライシングのメモリ モデルについて学びます。

まとめ

概要は非常にシンプルですが、言語も本質を見抜くには現象を見抜く必要があります。この記事には、覚えておくべき結論もあります:

Go には参照渡しはありません。

以上がGo 言語の比較 C++ 参照パラメータの受け渡しの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. C:比較されたアプリケーションとユースケースPython vs. C:比較されたアプリケーションとユースケースApr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間のPython計画:現実的なアプローチ2時間のPython計画:現実的なアプローチApr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python:主要なアプリケーションの調査Python:主要なアプリケーションの調査Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間でどのくらいのPythonを学ぶことができますか?2時間でどのくらいのPythonを学ぶことができますか?Apr 09, 2025 pm 04:33 PM

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの精度を改善する方法は?風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの精度を改善する方法は?Apr 02, 2025 am 07:09 AM

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの問題を解決する方法は?風光明媚なスポットコメントと分析を行っているとき、私たちはしばしばJieba Wordセグメンテーションツールを使用してテキストを処理します...

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 Mac版

SublimeText3 Mac版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境