国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

我終于識破了這個 Go 編譯器把戲

開發(fā) 后端
在 Go 語言的日常編碼工作中,有一個非常普遍但詭異的編譯錯誤,曾讓我十分困惑。這個問題我相信不少 Gopher 都遇到過,不妨來看一下。

[[421872]]

本文轉載自微信公眾號「Golang技術分享」,作者機器鈴砍菜刀。轉載本文請聯(lián)系Golang技術分享公眾號。

在 Go 語言的日常編碼工作中,有一個非常普遍但詭異的編譯錯誤,曾讓我十分困惑。這個問題我相信不少 Gopher 都遇到過,不妨來看一下。

背景回顧

我們定義一個帶有 WriteGoCode() 方法的 Gopher 接口,同時定義了 person 結構體,它存在 WriteGoCode() 方法。

  1. type Gopher interface { 
  2.  WriteGoCode() 
  3.  
  4. type person struct { 
  5.  name string 
  6.  
  7. func (p person) WriteGoCode() { 
  8.  fmt.Printf("I am %s, i am writing go code!\n", p.name

在 Go 語言中,只要某對象擁有接口的所有方法,那該對象即實現(xiàn)了該接口。p 是 person 結構體的實例化對象, Coding() 函數(shù)的入?yún)⑹? Gopher 接口, person 對象實現(xiàn)了 Gopher 接口,因此 p 入?yún)⒊晒Ρ贿\行。

  1. func Coding(g Gopher) { 
  2.  g.WriteGoCode() 
  3.  
  4. func main() { 
  5.  p := person{name"小菜刀"
  6.  Coding(p) 
  7.  
  8. // output
  9. I am 小菜刀, i am writing go code! 

此時,我們將 Coding() 函數(shù)的入?yún)⒏臑?[]Gopher 類型,入?yún)?[]person 。

  1. func Coding(g Gopher) { 
  2.  g.WriteGoCode() 
  3.  
  4. func main() { 
  5.  p := person{name"小菜刀"
  6.  Coding(p) 
  7.  
  8. // output
  9. I am 小菜刀, i am writing go code! 

但是,這個時候,編譯卻不能通過!

  1. ./main.go:29:8: cannot use p (type []person) as type []Gopher in argument to Coding 

明明 person 類型實現(xiàn)了 Gopher 接口,且當函數(shù)入?yún)?Gopher 類型時,能夠順利被執(zhí)行,但參數(shù)變?yōu)?[]Gopher 時,卻過不了編譯,這是為什么?

語法通用規(guī)則

這個問題在 stackoverflow 上被熱議,詳情見文末參考鏈接1。

在 Go 中,有一個通用規(guī)則,即語法不應隱藏復雜/昂貴的操作。轉換一個 string 到 interface{} 它的時間復雜度是 O(1),轉換 []string 到 interface{} 同樣也是一個 O(1) 操作,因為它還是一個單一值的轉換。

如果要將 []string 轉換為 []interface{},它是 O(N) 操作。因為切片的每個元素都必須轉換為 interface{},這違背了 Go 的語法原則。

這個回答,你們同意嗎?

當然,此規(guī)則存在一個例外:轉換字符串。在將 string 轉換為 []byte 或 []rune 時,即使需要 O(n) 操作,但 Go 會允許執(zhí)行。

InterfaceSlice 問題

Ian Lance Taylor(Go 核心開發(fā)者) 在 Go 官方倉庫中也回答了這個問題,詳情見文末參考鏈接2。他給出了這樣做的兩個主要原因。

原因一:類型為 []interface{} 的變量不是 interface!它僅僅是一個元素類型恰好為 interface{} 的切片。

原因二:[]interface{} 變量有特定大小的內(nèi)存布局,在編譯期可知。這與 []MyType 是不同的。

每個 interface{} (運行時通過 runtime.eface 表示)占兩個字長(一個字代表所包含內(nèi)容的類型 _type,另外一個字表示所包含的數(shù)據(jù) data 或者指向它的指針 )

因此,類型為 []interface{} 的長度為 N 的變量,它是由 N*2 個字長的數(shù)據(jù)塊支持。而這與類型為 []MyType 的長度為 N 的變量的數(shù)據(jù)塊大小是不同的,因為后者的數(shù)據(jù)塊是 N*sizeof(MyType) 字長。

數(shù)據(jù)塊的不同,造成的結果是編譯器無法快速地將 []MyType 類型的內(nèi)容分配給 []interface{} 類型的內(nèi)容。

同理,[]Gopher 變量也是特定大小的內(nèi)存布局(運行時通過 runtime.iface 表示)。這同樣不能快速地將 []MyType 類型的內(nèi)容分配給 []Gopher 類型。

因此,Ian Lance Taylor 回答閉環(huán)了 Go 的語法通用規(guī)則:Go 語法不應隱藏復雜/昂貴的操作,編譯器會拒絕它們。

代碼解決方案

再次將文章開頭的例子附上,如果我們需要 [] person 類型的 p 能夠成功入?yún)?Coding() 函數(shù),應該如何做呢。

  1. func Coding(gs []Gopher) { 
  2.  for _, g := range gs { 
  3.   g.WriteGoCode() 
  4.  } 
  5.  
  6. func main() { 
  7.  p := []person{ 
  8.   {name"小菜刀1號"}, 
  9.   {name"小菜刀2號"}, 
  10.  } 
  11.  Coding(p) 

代碼方案如下,核心是需要一個 []Gopher 類型的轉換變量。

  1. func main() { 
  2.  p := []person{ 
  3.   {name"小菜刀1號"}, 
  4.   {name"小菜刀2號"}, 
  5.  } 
  6.  var interfaceSlice []Gopher = make([]Gopher, len(p)) 
  7.  for i, g := range p { 
  8.   interfaceSlice[i] = g 
  9.  } 
  10.  Coding(interfaceSlice) 
  11.  
  12. // output
  13. I am 小菜刀1號, i am writing go code! 
  14. I am 小菜刀2號, i am writing go code! 

總結

由于 []MyType 到 []interface{} 的轉換,是昂貴的操作,Go 編譯器不會允許這種情況通過編譯,故而將這種開銷的責任傳遞給開發(fā)者。

Go 是一門編譯速度很快的語言,得益于它語法設計中貫徹著 “simpler is better” 的理念,這可不是說說而已。

參考鏈接

【1. Type converting slices of interfaces】https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces/12754757#12754757

【2. InterfaceSlice】https://github.com/golang/go/wiki/InterfaceSlice

 

責任編輯:武曉燕 來源: Golang技術分享
相關推薦

2013-12-30 11:21:31

Go編譯器

2022-07-01 06:44:42

微信應用偽裝應用轉生

2022-08-22 07:38:01

Go語言函數(shù)

2021-08-22 17:18:58

Go代碼泛型代碼

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2017-03-20 18:01:55

編譯器匯編

2009-08-10 17:12:54

C#編譯器

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-03-23 11:17:16

Python 動態(tài)編譯

2021-05-13 18:53:34

Go編譯器Uber

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者

2009-08-06 14:59:36

C#編譯器

2010-09-16 15:57:25

Java編譯器

2010-03-02 10:55:47

Linux SkyEy

2022-03-28 10:25:27

前端文件編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2011-05-18 11:06:25

java編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器
點贊
收藏

51CTO技術棧公眾號

深夜福利一区二区三区| 成人美女视频在线观看18| 欧美日韩高清影院| 黄页网站在线观看| 欧美国产日韩亚洲一区| 色999五月色| 欧美日韩亚洲一区在线观看| 国产精品va在线| 日韩视频一区二区三区四区| 亚洲理论在线a中文字幕| 国产在线看片| 欧美午夜免费电影| 一区二区三区性视频| 亚洲欧美色一区| 五月婷婷导航| 国产精品美女一区二区| 国产男女在线观看| 成人av资源在线| 欧美视频在线观看视频| 福利电影一区二区三区| 天天影视综合| av午夜在线| 夜夜夜精品看看| 2019日本中文字幕| 国产精品一区二区三区四区色 | 激情五月俺来也| 欧美18xxxx| 99久久精品免费看国产| 久久久亚洲精品无码| 九九九精品视频| 国产精品久久久久久久蜜臀| 精品中文字幕在线2019| 尤物视频免费在线观看| 黄色在线免费看| 欧亚在线中文字幕免费| 成人av在线资源网站| 91在线中文字幕| 欧美日本一区| 黄色高清无遮挡| 欧美理论电影在线| 国产精品流白浆在线观看| 天堂精品一区二区三区| 精品日本美女福利在线观看| 99re8这里有精品热视频免费| 91九色02白丝porn| 97国产精品免费视频| 欧美日韩p片| 日韩精品免费在线播放| 超碰在线cao| 成人高h视频在线| 91亚洲精品久久久蜜桃| 亚洲精品一级二级| 欧美日韩另类丝袜其他| 日韩一级欧美一级| 高清久久久久久| 日韩成人高清| 国产在线色视频| 国产精品久久久久久影院8一贰佰| 久久久免费看| 色天使久久综合网天天| 精品久久影视| 日本在线视频1区| 成人蜜桃视频| 日韩欧美成人一区二区| 欧美国产日本| 中文字幕制服丝袜一区二区三区| 久久网站热最新地址| 国产亚洲精品一区二区| 麻豆一区二区| 男人日女人的bb| 欧美日韩成人在线观看| 亚洲国产精品成人久久综合一区| 老牛国内精品亚洲成av人片| 视频二区在线播放| 成人网在线视频| 精品精品国产高清a毛片牛牛| 高清日韩中文字幕| 91年精品国产| 亚洲激情婷婷| 国产激情久久久| 久久99国产精品久久99 | 亚洲黄色免费网站| 黄色日韩在线| 99精品在免费线偷拍| 91短视频在线| 亚洲欧美激情视频| 一不卡在线视频| 激情五月开心婷婷| 欧美国产一区二区在线观看| 国产aⅴ精品一区二区三区久久| 成人av免费| 美女xx视频| 日韩极品视频在线观看| 精品视频免费观看| 国内精品久久影院| 亚洲第一久久影院| 久久久久久久久久久久久久久久av| 水蜜桃亚洲精品| 欧美黄视频在线观看| 国产1区2区在线| 国产成人精品a视频一区www| 亚洲第一国产精品| 欧美三级资源在线| 国产精品嫩草99a| 国产成人精品午夜视频免费 | 五月婷婷之综合激情| 亚洲天堂成人在线视频| 国产真实生活伦对白| 四虎4hutv紧急入口| 亚洲高清在线视频| 欧美成人综合| 国产一区国产二区国产三区| 日韩最新在线| 亚洲人成精品久久久| 日韩一二三区| 精品视频在线播放一区二区三区| 高清av一区二区三区| www 久久久| 亚洲在线观看一区| 欧美天天视频| 韩国理伦片一区二区三区在线播放| 999香蕉视频| 国产综合中文字幕| 东北少妇不带套对白| 91大学生片黄在线观看| 精品视频在线观看一区| 日韩一级理论片| 一级毛片免费在线| 在线视频国产区| 国产91免费视频| 99久久99久久精品国产片桃花| 麻豆精品一区二区三区| 黄色大片在线播放| 天堂中文字幕| www.com黄色片| 最新亚洲伊人网| 在线看片国产福利你懂的| 黄色免费大全亚洲| 91久久黄色| 国产精品久久午夜| 亚洲成色777777在线观看影院| 久久精品国亚洲| 日韩在线www| 西西人体一区二区| 北条麻妃99精品青青久久| 久草在线中文最新视频| 亚州黄色一级| 成人国产免费电影| 五月天亚洲色图| 国产尤物一区二区在线| 亚洲综合色丁香婷婷六月图片| 日韩视频一区二区| 国产精品极品美女粉嫩高清在线| 亚洲精品成人a8198a| 另类小说色综合| 99re视频在线| 国产精品久久久久久久久久久免费看| 日韩电影免费观看在线观看| 亚洲欧洲日韩在线| 亚洲精品在线观看视频| 亚洲伊人成综合成人网| 黄色毛片av| 国产精品极品国产中出| 国产精品18久久久久久久久久久久 | 欧美激情成人动漫| 精品精品导航| 欧美日韩亚洲一区三区| 亚洲最快最全在线视频| 欧美性受xxxx黑人猛交| 欧美丰满熟妇bbbbbb百度| 欧美大片免费高清观看| 日韩av网站在线观看| 亚洲电影在线观看| 美女在线免费视频| 国产区日韩欧美| 亚洲.国产.中文慕字在线| 91九色国产在线| 国产一区二区精品丝袜| 亚洲97在线观看| 国产福利影院在线观看| 国产精品嫩草影院在线看| 五月天婷婷综合| 久久久精彩视频| 欧美男男激情videos| 国产精品亚洲а∨天堂免在线| 九九视频直播综合网| 97视频在线观看免费| 亚洲男人天堂2023| 日韩有码片在线观看| 国产精品swag| 国产美女被遭强高潮免费网站| 欧美特黄色片| 91蜜桃视频在线| 2019亚洲日韩新视频| 午夜dv内射一区二区| 无码人妻aⅴ一区二区三区日本| 污视频网站免费看| 精品国产18久久久久久二百| 午夜无码国产理论在线| 丝袜中文在线|