黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 使用具名返回值巧妙解決泛型函數返回零值的問題

使用具名返回值巧妙解決泛型函數返回零值的問題

來源:千鋒教育
發布人:qyf
時間: 2022-08-04 16:17:00 1659601020

使用具名返回值巧妙解決泛型函數返回零值的問題

  Go語言泛型語法特性在Go 1.18版本落地后,不出所料,在github上看到大量的基礎容器類型數據結構被用泛型重寫。這種重寫我覺得是很正常、很自然的,并且實現良好的通用數據結構改為泛型其實也不難,有些簡單的結構可能分分鐘就能搞定。

  Go 1.18發布后,我一直沒機會寫泛型,今天在做DSL語義模型提取時,多處用到Stack結構,于是想到使用泛型簡單實現了一個通用的Stack結構。

  在Go中,我們可以用一個切片來定義Stack。泛型Stack類型的定義如下:

  type Stack[T any] []T

  這里的Stack類型就是一個帶有類型參數(type parameter)的泛型類型,它的類型參數的約束(constraints)為any,即允許任何類型作為Stack的元素類型。

  Stack是最基礎的數據結構,一般來說它具有的操作方法包括:

  Push:壓棧;

  Pop:彈棧;

  Top:獲取棧頂元素;

  Len:獲取棧內元素個數。

  對于以切片為底層存儲的Stack而言,壓棧Push操作就相當于對切片的追加(append)操作:

  func (s *Stack[T]) Push(v T) {

  (*s) = append((*s), v)

  }

  不過,這里有兩點要注意:

  泛型類型的方法原型中,receiver部分的類型要帶上類型參數,比如這里的*Stack[T];

  這里務必要用*Stack[T],而不要像下面代碼這樣用Stack[T],否則append方法改變的僅僅是Stack[T]的拷貝,而不是原Stack[T]類型的實例。

  func (s Stack[T]) Push(v T) {

  s = append(s, v)

  }

  我們再來看看*Stack[T]的彈棧Pop方法:

  func (s *Stack[T]) Pop() T {

  if len(*s) == 0 {

  return nil

  }

  // Get the last element from the stack.

  t := (*s)[len(*s)-1]

  // Remove the last element from the stack.

  *s = (*s)[:len(*s)-1]

  return t

  }

  這樣實現的Pop方法會提示return nil一行有錯誤:cannot use nil as T value in return statement。Go編譯器錯誤信息提示我們:nil不能作為T類型的值返回。

  Stack的類型參數的約束為any,即Stack的元素可以是任意類型,即可以是切片、map等復合類型,亦可以是int、string等值類型。如果將nil作為所有這些類型的零值的確不恰當。

  那么當Stack為空時,應該如何返回呢?多虧Go原生支持類型零值。

  我們可以聲明一個類型零值并將其作為返回值返回:

  func (s *Stack[T]) Pop() T {

  if len(*s) == 0 {

  var zero T

  return zero // 模擬類型零值

  }

  // Get the last element from the stack.

  t := (*s)[len(*s)-1]

  // Remove the last element from the stack.

  *s = (*s)[:len(*s)-1]

  return t

  }

  雖然這種方法有效,但你是不是和我有一樣的感覺:不夠優雅。下面我們就來看一個更為優雅的小技巧:利用函數的具名返回值,看代碼:

  func (s *Stack[T]) Pop() (t T) {

  if len(*s) == 0 {

  return

  }

  // Get the last element from the stack.

  t = (*s)[len(*s)-1]

  // Remove the last element from the stack.

  *s = (*s)[:len(*s)-1]

  return

  }

  我們看到:具名返回值(named return value)一出馬,一切都變得自然而然了。當然這也要歸功于Go的類型零值特性。

  具名返回值日常使用的不多,從使用的頻度來看,Go標準庫以及多數項目的代碼默認選擇非具名返回值(unamed return value)。當函數使用defer且在deferred函數中修改外部函數返回值時,應用具名返回值可以讓代碼顯得更清晰一些:

  func Foo() (a int) {

  defer func() {

  a = 5

  }

  a = 6

  }

  其他情況,看項目編碼規范一致性要求以及個人喜好了。不過,Go引入泛型后,針對上述的泛型函數返回零值的情況,相信具名返回值將得到更多的“出鏡”的機會。

  更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業需求,更科學更嚴謹,每年培養泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
色综合久久手机在线| 你懂的日韩| 青草国产在线| 亚洲第一页乱| 毛片高清| 国产不卡福利| 香蕉视频一级| 精品久久久久久中文| 国产不卡在线看| 精品视频在线观看一区二区 | 精品国产一区二区三区精东影业| 久草免费在线视频| 成人免费观看的视频黄页| 精品毛片视频| 欧美激情影院| 日韩中文字幕在线观看视频| 999久久久免费精品国产牛牛| 97视频免费在线| 久草免费在线观看| 精品国产一区二区三区久 | 亚洲 国产精品 日韩| 亚洲精品中文一区不卡| 午夜欧美福利| 日韩av成人| 国产成人精品综合在线| 免费毛片播放| 欧美一级视频免费观看| 一本伊大人香蕉高清在线观看| 韩国妈妈的朋友在线播放| 日韩男人天堂| 精品视频在线观看一区二区 | 四虎精品在线观看| 韩国妈妈的朋友在线播放| 国产网站免费在线观看| 国产综合成人观看在线| 国产极品白嫩美女在线观看看| 国产91视频网| 青青青草影院 | 精品国产一区二区三区久| 国产福利免费观看| 四虎影视久久| 欧美a级片视频| 亚洲精品中文一区不卡| 日韩免费在线观看视频| 精品久久久久久免费影院| 99热精品在线| 日韩在线观看免费| 成人免费网站视频ww| 999精品视频在线| 国产视频一区二区在线观看| 国产麻豆精品免费密入口| 国产网站麻豆精品视频| 国产伦久视频免费观看视频| 亚洲www美色| 精品视频免费看| 日韩av成人| 99久久精品国产麻豆| 国产一区免费观看| 99久久精品国产麻豆| 国产高清视频免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 黄色福利| 国产麻豆精品高清在线播放| 91麻豆爱豆果冻天美星空| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美日本免费| 精品国产一区二区三区免费| 美女免费精品高清毛片在线视| 青青久久精品| 久草免费在线观看| 青青久久精品| 久久99这里只有精品国产| 午夜在线亚洲| 国产一区二区高清视频| 亚洲精品影院| 天堂网中文字幕| 国产不卡福利| 麻豆午夜视频| 91麻豆精品国产高清在线| 国产不卡在线看| 中文字幕Aⅴ资源网| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品久久久久久中文字幕一区 | 欧美日本免费| 亚洲精品影院| 日韩在线观看免费| 日韩专区一区| 亚洲天堂一区二区三区四区| 日韩在线观看视频免费| 国产亚洲精品aaa大片| 久久国产精品自线拍免费| 精品美女| 亚洲精品中文一区不卡| 日本特黄一级| 久草免费资源| 99色精品| 亚洲精品中文一区不卡| 日韩中文字幕一区二区不卡| 国产一级强片在线观看| 国产成人精品综合在线| 尤物视频网站在线观看| 久久精品大片| 黄色福利片| 精品国产一区二区三区久久久蜜臀| 可以免费看污视频的网站| 成人高清视频免费观看| 欧美另类videosbestsex| 成人免费观看的视频黄页| 国产综合91天堂亚洲国产| 国产成人精品影视| 在线观看导航| 九九久久国产精品| 久久久久久久免费视频| 99久久精品国产高清一区二区| 天天做人人爱夜夜爽2020| 欧美大片a一级毛片视频| 日本在线不卡免费视频一区| 国产高清在线精品一区二区| 免费的黄视频| 国产一区二区精品在线观看| 中文字幕一区二区三区 精品| 亚洲精品久久玖玖玖玖| 国产一区国产二区国产三区| 在线观看导航| 成人影视在线播放| 日本在线www| 超级乱淫黄漫画免费| 麻豆网站在线免费观看| 日韩一级精品视频在线观看| 可以免费看污视频的网站| 国产亚洲精品aaa大片| 日日日夜夜操| 天天做人人爱夜夜爽2020| 国产成人精品影视| 精品国产香蕉在线播出| 99久久精品国产片| 国产一级强片在线观看| 日本在线www| 天天做日日爱| 成人高清免费| 欧美一级视频免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产极品精频在线观看| 日韩一级黄色片| 亚洲精品影院| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲天堂在线播放| 香蕉视频三级| 天天做日日爱| 天天做日日干| 国产精品123| 香蕉视频一级| 国产网站在线| 香蕉视频久久| 美女免费精品视频在线观看| a级精品九九九大片免费看| 免费一级生活片| 免费国产在线视频| 成人a级高清视频在线观看| 国产麻豆精品| 黄色免费三级| 国产亚洲精品aaa大片| 尤物视频网站在线观看| 日韩中文字幕在线播放| 久久精品欧美一区二区| 麻豆网站在线看| 欧美另类videosbestsex| 国产成人精品影视| 四虎影视精品永久免费网站| 国产视频久久久| 亚洲 男人 天堂| 日日日夜夜操| 美女免费精品视频在线观看| 精品视频免费在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 一级女性全黄久久生活片| 四虎精品在线观看| 亚州视频一区二区| 欧美激情一区二区三区在线播放| 麻豆网站在线看| 国产一区精品| 国产网站麻豆精品视频| 欧美日本免费| 日日日夜夜操| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美激情在线精品video| 欧美另类videosbestsex久久| 欧美日本二区| 国产麻豆精品| 999精品视频在线| 成人在激情在线视频| 久久国产精品只做精品| 久久99这里只有精品国产| 欧美激情一区二区三区视频 | 亚洲精品中文字幕久久久久久| 超级乱淫伦动漫| 日韩专区第一页| 国产国语对白一级毛片| 成人高清视频在线观看| 毛片高清|