亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言到底有沒有引用傳參(對比 C++ )

2020-04-01 19:04:10
字體:
來源:轉載
供稿:網友

C++ 中三種參數傳遞方式

值傳遞:

最常見的一種傳參方式,函數的形參是實參的拷貝,函數中改變形參不會影響到函數外部的形參。一般是函數內部修改參數而又不希望影響到調用者的時候會采用值傳遞。

指針傳遞

形參是指向實參地址的一個指針,顧名思義,在函數中對形參指向的內容操作,實參本身會被修改。

引用傳遞

在 C++ 中,引用是變量的別名,實際上是同一個東西,在內存中也存在同一個地址。換句話說,不管在哪里對引用操作,都相當直接操作被引用的變量。

下面看 demo:

#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 中的參數傳遞

上面介紹了 C++ 的三種參數傳遞方式,值傳遞和指針傳遞容易理解,那么 Go 是不是也有這些傳參方式呢?這引起過爭論,但是對比 C++ 的引用傳遞的概念,我們可以說,Go 沒有引用傳遞方式。為什么這么說,因為 Go 沒有變量的引用這一概念。但是 Go 有引用類型,這個稍后再解釋。

先看一個 Go 傳值和傳指針的例子:

package mainimport (  "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 mainimport (  "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 mainimport (  "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

這個結果說明,調用前后切片并沒有發生變化。之前例子中所謂的“變化”其實是切片中指向數組的指針指向的數組的元素發生了變化,這句話可能比較拗口,但實際如此。再次證明,引用類型的傳參不是 pass-by-reference 。

想透徹的了解 一個切片是一個數組片段的描述。它包含了指向數組的指針,片段的長度這句話。學習一下切片的內存模型。

總結

總結很簡單,語言也需要透過現象看本質。還有本文的結論需要記住:

There is no pass-by-reference in Go.

以上所述是小編給大家介紹的Go語言到底有沒有引用傳參(對比 C++ ),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久影院资源站| 精品日本高清在线播放| 中文字幕国内精品| 亚洲一区二区久久| 久久综合网hezyo| 国产va免费精品高清在线| 国产精品狼人色视频一区| 国产91精品不卡视频| 国产视频精品一区二区三区| 亚洲欧洲日产国产网站| 亚洲欧美国产一区二区三区| 国产精品999999| 欧美日韩国产精品一区二区不卡中文| 97成人精品视频在线观看| 高清日韩电视剧大全免费播放在线观看| 国产综合色香蕉精品| 欧美视频在线观看免费网址| 国产精品尤物福利片在线观看| 在线观看国产精品91| 一本色道久久综合亚洲精品小说| 亚洲高清福利视频| 国产一区二区三区直播精品电影| 国产精品扒开腿做爽爽爽男男| 色噜噜国产精品视频一区二区| 亚洲精品久久久久久久久| 亚洲精品中文字幕女同| 欧美在线观看网址综合| 国产精品欧美久久久| 欧美成人在线免费| 欧美日韩午夜视频在线观看| 草民午夜欧美限制a级福利片| 欧美日韩国产精品| 欧洲日韩成人av| 久久久综合免费视频| 中文字幕亚洲欧美日韩高清| 97碰碰碰免费色视频| 欧美成年人视频网站| 一个人看的www久久| 久久这里只有精品99| 一区二区三区日韩在线| 国产日韩欧美视频| 国产成人一区二| 少妇久久久久久| 人人澡人人澡人人看欧美| 26uuu日韩精品一区二区| 精品色蜜蜜精品视频在线观看| 国产精品午夜视频| 日韩高清电影免费观看完整| 欧美福利视频在线| 国产一区二区成人| 日韩小视频在线观看| 久久国产一区二区三区| 91牛牛免费视频| 中文字幕在线看视频国产欧美在线看完整| 亚洲片在线观看| 中文字幕在线日韩| 国产精品夫妻激情| 国产精品视频在线观看| 国产精品久久久久久av下载红粉| 欧美日韩午夜视频在线观看| 亚洲国产精品yw在线观看| 欧美一区二区三区图| 2018日韩中文字幕| 亚洲国产99精品国自产| 久久九九全国免费精品观看| 亚洲香蕉成视频在线观看| 亚洲综合中文字幕在线观看| 亚洲一区美女视频在线观看免费| 亚洲电影免费观看高清完整版在线| 久久躁日日躁aaaaxxxx| 国产欧美精品在线播放| 日韩久久精品成人| 亚洲欧美精品伊人久久| 国产日韩综合一区二区性色av| 国产美女高潮久久白浆| 91精品久久久久久久久中文字幕| 国产精品久久久久免费a∨| 国产精品高清在线| 亚洲人在线观看| 欧美日韩在线免费| 91av视频在线播放| 欧美高清一级大片| 精品久久香蕉国产线看观看gif| 日韩在线视频网站| 久久久久久久999精品视频| 亚洲春色另类小说| 欧美激情在线有限公司| 国产原创欧美精品| 国产激情久久久| 欧美www在线| 午夜免费久久久久| 国产精品高潮粉嫩av| 欧美激情一二三| 欧美一区深夜视频| 久久久综合av| 亚洲精品乱码久久久久久按摩观| 国产日韩在线精品av| 富二代精品短视频| 欧美又大粗又爽又黄大片视频| 亚洲国产精品一区二区久| 日韩欧美aⅴ综合网站发布| 国产精品久久久久久久9999| 97成人精品视频在线观看| 精品国产一区二区三区久久狼黑人| 久久久久北条麻妃免费看| 亚洲精品久久久一区二区三区| 日韩男女性生活视频| 一本大道久久加勒比香蕉| 国产精品成人国产乱一区| 色综合久久中文字幕综合网小说| 国产福利精品在线| 亚洲第一福利网站| 69精品小视频| 国产成人综合av| 伊人久久久久久久久久| 国产综合福利在线| 欧美黑人国产人伦爽爽爽| 久久久97精品| 宅男66日本亚洲欧美视频| 欧美中文在线观看国产| 亚洲综合日韩中文字幕v在线| 国产精品福利网站| 91av在线播放视频| 欧美第一淫aaasss性| 亚洲欧美在线播放| 91在线网站视频| 国产成人91久久精品| 久久精品夜夜夜夜夜久久| 久久久亚洲国产天美传媒修理工| 91久久精品国产| 久久久亚洲天堂| 午夜精品久久久久久久99热| 国产精品久久久久高潮| 亚洲自拍小视频| 欧美激情videoshd| 久久精品电影一区二区| 亚洲成人av中文字幕| 国产精品久久久久久超碰| 日日狠狠久久偷偷四色综合免费| 国产精品久久久久久网站| 久久99视频精品| 色偷偷av亚洲男人的天堂| 亚洲а∨天堂久久精品9966| 久久亚洲春色中文字幕| 中文字幕少妇一区二区三区| 欧美中文字幕在线视频| 中文字幕在线日韩| 在线观看国产精品91| 成人av番号网| 日本精品中文字幕| 日韩av中文字幕在线播放| 国产精品私拍pans大尺度在线| 亚洲欧美三级伦理| 成人做爽爽免费视频| 国产精品中文字幕在线| 亚洲人免费视频| 91香蕉国产在线观看| 日韩中文字幕国产| 中文字幕亚洲综合久久| 91理论片午午论夜理片久久| 成人中心免费视频| 久久露脸国产精品| 精品调教chinesegay| 亚洲精品福利视频|