이 글에서는 Go에 참조에 의한 매개변수 전달(C++과 비교)이 있는지 여부를 주로 소개합니다. 필요한 친구는
C++
값 전달:
가장 일반적입니다. 매개변수 전달 방법 함수의 형식 매개변수는 실제 매개변수의 복사본입니다. 함수 내에서 형식 매개변수를 변경해도 함수 외부의 형식 매개변수에는 영향을 미치지 않습니다. 일반적으로 값 전달은 호출자에게 영향을 주지 않고 함수 내의 매개변수를 수정할 때 사용됩니다.
포인터 전달
형식 매개변수는 실제 매개변수의 주소를 가리키는 포인터입니다. 이름에서 알 수 있듯이 형식 매개변수가 가리키는 내용이 함수 내에서 조작되면 실제 매개변수 자체가 수정됩니다. .
참조로 전달
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이 변경되었는지 확인해야 합니다. 먼저 슬라이싱의 본질을 이해해야 합니다.
슬라이스(Slice)는 배열 조각에 대한 설명입니다. 여기에는 조각의 길이인 배열에 대한 포인터가 포함되어 있습니다.
즉, 위에서 인쇄한 것은 슬라이스 자체가 아니라 슬라이스가 가리키는 배열입니다. 또 다른 예로 슬라이스가 변경되었는지 확인합니다.
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 문서를 읽어보세요. 슬라이싱의 메모리 모델에 대해 알아보세요.
Summary
요약은 아주 간단하고, 언어도 현상을 꿰뚫어 봐야 본질을 볼 수 있습니다. 기억해야 할 이 글의 결론도 있습니다:
Go에는 참조에 의한 전달이 없습니다.
위 내용은 Go 언어 비교 C++ 참조 매개변수 전달의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 같은 작업에 적합합니다.

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...

경치 좋은 스팟 댓글 분석에서 Jieba Word 세분화 문제를 해결하는 방법은 무엇입니까? 경치가 좋은 스팟 댓글 및 분석을 수행 할 때 종종 Jieba Word 세분화 도구를 사용하여 텍스트를 처리합니다 ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

Dreamweaver Mac版
시각적 웹 개발 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
