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

首頁 > 編程 > Golang > 正文

golang中值類型/指針類型的變量區別總結

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

前言

值類型:所有像int、float、bool和string這些類型都屬于值類型,使用這些類型的變量直接指向存在內存中的值,值類型的變量的值存儲在棧中。當使用等號=將一個變量的值賦給另一個變量時,如 j = i ,實際上是在內存中將 i 的值進行了拷貝??梢酝ㄟ^ &i 獲取變量 i 的內存地址

golang/70754.html">指針類型:簡單地說go語言的指針類型和C/C++的指針類型用法是一樣的,除了出去安全性的考慮,go語言增加了一些限制,包括如下幾條:

  • 不同類型的指針不能互相轉化,例如*int, int32, 以及int64
  • 任何普通指針類型*T和uintptr之間不能互相轉化
  • 指針變量不能進行運算, 比如C/C++里面的++, --運算

下面將給大家詳細介紹golang/72687.html">golang中值類型/指針類型的變量的一些區別,下面話不多說了,來一起看看詳細的介紹吧。

值類型的變量和指針類型的變量

先聲明一個結構體:

type T struct { Name string}func (t T) M1() { t.Name = "name1"}func (t *T) M2() { t.Name = "name2"}

M1() 的接收者是值類型 T, M2() 的接收者是值類型 *T , 兩個方法內都是改變Name值。

下面聲明一個 T 類型的變量,并調用 M1()M2() 。

 t1 := T{"t1"} fmt.Println("M1調用前:", t1.Name) t1.M1() fmt.Println("M1調用后:", t1.Name) fmt.Println("M2調用前:", t1.Name) t1.M2() fmt.Println("M2調用后:", t1.Name)

輸出結果為:

M1調用前: t1

M1調用后: t1

M2調用前: t1

M2調用后: name2

下面猜測一下go會怎么處理。

先來約定一下:接收者可以看作是函數的第一個參數,即這樣的: func M1(t T) , func M2(t *T) 。 go不是面向對象的語言,所以用那種看起來像面向對象的語法來理解可能有偏差。

當調用 t1.M1() 時相當于 M1(t1) ,實參和行參都是類型 T,可以接受。此時在M1()中的t只是t1的值拷貝,所以M1()的修改影響不到t1。

當調用 t1.M2() => M2(t1) ,這是將 T 類型傳給了 *T 類型,go可能會取 t1 的地址傳進去: M2(&t1) 。所以 M2() 的修改可以影響 t1 。

類型的變量這兩個方法都是擁有的。

下面聲明一個 *T 類型的變量,并調用 M1()M2()

 t2 := &T{"t2"} fmt.Println("M1調用前:", t2.Name) t2.M1() fmt.Println("M1調用后:", t2.Name) fmt.Println("M2調用前:", t2.Name) t2.M2() fmt.Println("M2調用后:", t2.Name)

輸出結果為:

M1調用前: t2

M1調用后: t2

M2調用前: t2

M2調用后: name2

t2.M1() => M1(t2) , t2 是指針類型, 取 t2 的值并拷貝一份傳給 M1。

t2.M2() => M2(t2) ,都是指針類型,不需要轉換。

*T 類型的變量也是擁有這兩個方法的。

傳給接口會怎樣?

先聲明一個接口

type Intf interface { M1() M2()}

使用:

 var t1 T = T{"t1"} t1.M1() t1.M2() var t2 Intf = t1 t2.M1() t2.M2()

報錯:

./main.go:9: cannot use t1 (type T) as type Intf in assignment:

T does not implement Intf (M2 method has pointer receiver)

var t2 Intf = t1 這一行報錯。

t1 是有 M2() 方法的,但是為什么傳給 t2 時傳不過去呢?

簡單來說,按照接口的理論:傳過去【賦值】的對象必須實現了接口要求的方法,而t1沒有實現M2() ,t1的指針實現了M2() 。另外和c語言一樣,函數名本身就是指針

當把 var t2 Intf = t1 修改為 var t2 Intf = &t1 時編譯通過,此時 t2 獲得的是 t1 的地址, t2.M2() 的修改可以影響到 t1 了。

如果聲明一個方法 func f(t Intf) , 參數的傳遞和上面的直接賦值是一樣的情況。

嵌套類型

聲明一個類型 S,將 T 嵌入進去

type S struct { T }

使用下面的例子測試一下:

 t1 := T{"t1"}  s := S{t1}  fmt.Println("M1調用前:", s.Name)  s.M1()  fmt.Println("M1調用后:", s.Name)  fmt.Println("M2調用前:", s.Name)  s.M2()  fmt.Println("M2調用后:", s.Name)  fmt.Println(t1.Name)

輸出:

M1調用前: t1

M1調用后: t1

M2調用前: t1

M2調用后: name2

t1

將 T 嵌入 S, 那么 T 擁有的方法和屬性 S 也是擁有的,但是接收者卻不是 S 而是 T。

所以 s.M1() 相當于 M1(t1) 而不是 M1(s)

最后 t1 的值沒有改變,因為我們嵌入的是 T 類型,所以 S{t1} 的時候是將 t1 拷貝了一份。

假如我們將 s 賦值給 Intf 接口會怎么樣呢?

 var intf Intf = s  intf.M1()  intf.M2()

報錯:

cannot use s (type S) as type Intf in assignment: S does not implement Intf (M2 method has pointer receiver)

還是 M2() 的問題,因為 s 此時還是值類型。

var intf Intf = &s 這樣的話編譯通過了,如果在 intf.M2() 中改變了 Name 的值, s.Name 被改變了,但是 t1.Name 依然沒變,因為現在 t1 和 s 已經沒有聯系了。

下面嵌入 *T 試試:

type S struct { *T }

使用時這樣:

 t1 := T{"t1"}  s := S{&t1}  fmt.Println("M1調用前:", s.Name)  s.M1()  fmt.Println("M1調用后:", s.Name)  fmt.Println("M2調用前:", s.Name)  s.M2()  fmt.Println("M2調用后:", s.Name)  fmt.Println(t1.Name)

M1調用前: t1

M1調用后: t1

M2調用前: t1

M2調用后: name2

name2

惟一的區別是最后 t1 的值變了,因為我們復制的是指針。

接著賦值給接口試試:

 var intf Intf = s i ntf.M1()  intf.M2()  fmt.Println(s.Name)

編譯沒有報錯。這里我們傳遞給 intf 的是值類型而不是指針,為什么可以通過呢?

拷貝 s 的時候里面的 T 是指針類型,所以調用 M2() 的時候傳遞進去的是一個指針。

var intf Intf = &s 的效果和上面一樣。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性videos高清精品| 成人精品在线视频| 亚洲午夜国产成人av电影男同| 韩国一区二区电影| xxxxx成人.com| 日韩视频―中文字幕| 日韩欧美在线视频观看| 久精品免费视频| 日日摸夜夜添一区| 国产日本欧美一区二区三区在线| 国产美女91呻吟求| 欧美激情三级免费| 国产精品ⅴa在线观看h| 欧美日韩免费一区| 久久不射热爱视频精品| 亚洲人在线视频| 欧美激情视频一区二区三区不卡| 亚洲国产日韩欧美在线图片| 亚洲国产日韩欧美在线图片| 国产精品视频免费在线观看| 伊人久久大香线蕉av一区二区| 亚洲影院污污.| 日韩在线播放视频| 欧美亚洲在线观看| 538国产精品一区二区在线| 91福利视频网| 7m精品福利视频导航| 国产精品高潮呻吟久久av无限| 国产91精品久| 日韩精品中文字幕视频在线| 亚洲综合日韩在线| 国产亚洲精品久久久久动| 久久久久久久国产精品视频| 国产69精品久久久久9| 久久久免费精品| 亚洲一区第一页| 91超碰caoporn97人人| 国产精品美女午夜av| 国产精品永久免费视频| 亚洲视频一区二区三区| 欧美乱大交xxxxx| 欧美又大又硬又粗bbbbb| 日韩在线www| 久久在精品线影院精品国产| 亚洲欧美日韩精品久久| 欧美一级淫片videoshd| 日韩av综合中文字幕| 国产精品日韩久久久久| 在线日韩欧美视频| 中文字幕亚洲综合久久筱田步美| 欧美午夜丰满在线18影院| 亚洲人成在线免费观看| 久久6免费高清热精品| 成人黄色生活片| 欧美激情小视频| 国色天香2019中文字幕在线观看| 国产mv久久久| 亚洲视频在线免费看| 亚洲最大福利网站| 亚洲天堂一区二区三区| 亚洲人a成www在线影院| 亚洲欧美色图片| 精品久久久视频| 久久久久久久色| 亚洲国产97在线精品一区| 亚洲午夜未满十八勿入免费观看全集| 在线观看欧美日韩| 中文字幕av一区二区三区谷原希美| 成人精品视频99在线观看免费| 国产狼人综合免费视频| 日韩av片电影专区| 欧美孕妇与黑人孕交| 91精品国产九九九久久久亚洲| 久久久久中文字幕2018| 国产区精品在线观看| 国产精品高潮呻吟久久av无限| 日韩在线观看免费高清完整版| 中文欧美日本在线资源| 欧美大片欧美激情性色a∨久久| 最近2019年手机中文字幕| 欧美日韩在线视频观看| 亚洲sss综合天堂久久| 亚洲欧洲高清在线| 国产精品igao视频| 亚洲三级免费看| 在线国产精品视频| 欧美高清电影在线看| 国产91在线高潮白浆在线观看| 精品无人区太爽高潮在线播放| 在线免费看av不卡| 精品日韩视频在线观看| 中文在线资源观看视频网站免费不卡| 麻豆乱码国产一区二区三区| 曰本色欧美视频在线| 97久久精品视频| 中文.日本.精品| 亚洲国产欧美一区二区三区久久| 亚洲天天在线日亚洲洲精| 亚洲女人天堂网| 美女久久久久久久久久久| 国产亚洲精品激情久久| 97香蕉超级碰碰久久免费的优势| 91精品综合久久久久久五月天| 国产丝袜视频一区| 亚洲无限乱码一二三四麻| 日韩美女在线观看| 97av在线视频免费播放| 日韩美女av在线免费观看| 欧美在线视频网| 欧美日韩电影在线观看| 日本欧美一二三区| 亚洲精品国产电影| 日韩视频免费观看| 国产精品久久久久77777| 欧美午夜女人视频在线| 国产精品一区二区久久国产| 成人妇女淫片aaaa视频| 日韩视频第一页| 亚洲电影免费观看高清| 久久手机精品视频| 动漫精品一区二区| 91成人精品网站| 国产成人一区二区三区| 欧美成在线视频| 一个人看的www久久| 欧美大片va欧美在线播放| 在线视频中文亚洲| 欧美日韩成人网| 最近2019中文字幕在线高清| 欧美日韩国产一区二区| 日韩亚洲精品视频| 国产欧美一区二区三区久久| 国产精品永久免费观看| 国产国语刺激对白av不卡| 亚洲精品午夜精品| 午夜免费在线观看精品视频| 欧美日韩国产在线看| 亚洲欧美日韩视频一区| 亚洲视频视频在线| 国产在线拍揄自揄视频不卡99| 国产欧美日韩中文字幕在线| 精品视频在线导航| 日韩亚洲综合在线| 欧美韩国理论所午夜片917电影| 国产精品久久久久99| 91亚洲国产成人久久精品网站| 国产亚洲欧洲高清| 欧美日韩国产成人高清视频| 日韩在线视频二区| 欧美电影免费观看| 亚洲少妇激情视频| 亚洲区在线播放| 精品视频久久久| 国产黑人绿帽在线第一区| 日本三级韩国三级久久| 国产精品爽爽爽爽爽爽在线观看| 亚洲人成在线免费观看| 亚洲第一黄色网| 国产亚洲精品一区二555| 亚洲第一av网站| 日韩av免费一区| 亚洲精品国产福利| 欧美日韩国产综合视频在线观看中文| 亚洲欧美精品suv|