色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

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

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

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

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

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

  Go 1.18發(fā)布后,我一直沒機會寫泛型,今天在做DSL語義模型提取時,多處用到Stack結(jié)構(gòu),于是想到使用泛型簡單實現(xiàn)了一個通用的Stack結(jié)構(gòu)。

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

  type Stack[T any] []T

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

  Stack是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),一般來說它具有的操作方法包括:

  Push:壓棧;

  Pop:彈棧;

  Top:獲取棧頂元素;

  Len:獲取棧內(nèi)元素個數(shù)。

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

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

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

  }

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

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

  這里務(wù)必要用*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

  }

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

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

  那么當Stack為空時,應(yīng)該如何返回呢?多虧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

  }

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

  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標準庫以及多數(shù)項目的代碼默認選擇非具名返回值(unamed return value)。當函數(shù)使用defer且在deferred函數(shù)中修改外部函數(shù)返回值時,應(yīng)用具名返回值可以讓代碼顯得更清晰一些:

  func Foo() (a int) {

  defer func() {

  a = 5

  }

  a = 6

  }

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

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

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
成人性生交大片免费| 欧美人与禽zozo性伦| 成人免费的视频| 欧美电视剧免费全集观看 | 777精品伊人久久久久大香线蕉| 国产欧美日韩中文久久| 亚洲综合一区二区精品导航| 国产精品青草综合久久久久99| 亚洲欧洲无码一区二区三区| 最新热久久免费视频| 午夜在线电影亚洲一区| 亚洲专区一二三| 亚洲国产电影在线观看| 在线观看视频一区二区| 精品一区二区成人精品| 精品国产99国产精品| 水野朝阳av一区二区三区| 一区二区三区久久久| 欧美三级电影精品| 成人在线综合网| 精品影视av免费| 国产女同互慰高潮91漫画| 一区二区三区四区在线免费观看| 国产一区在线精品| 欧美日韩国产123区| 亚洲欧美日韩在线不卡| 亚洲伊人伊色伊影伊综合网| 婷婷六月综合网| 麻豆成人在线观看| 亚洲午夜在线电影| 亚洲人成网站色在线观看| 亚洲成人黄色小说| 欧美精品久久久久久久多人混战 | 国产成人综合自拍| 亚洲成人自拍一区| 综合自拍亚洲综合图不卡区| 国产成人综合亚洲网站| 国产蜜臀97一区二区三区| 成人av电影在线| 中文字幕日本乱码精品影院| 国产一区二区三区久久悠悠色av| 久久久久9999亚洲精品| 中文字幕日本不卡| 国产精品一区久久久久| 日本韩国精品一区二区在线观看| 国产99久久久久| 亚洲精品国产精华液| 欧美日本不卡视频| 久久亚洲精品国产精品紫薇| 亚洲欧美一区二区不卡| 极品少妇xxxx偷拍精品少妇| 91在线一区二区三区| 成人开心网精品视频| 亚洲一区av在线| 久久品道一品道久久精品| 欧美日韩三级一区二区| 韩国毛片一区二区三区| 午夜精品一区二区三区免费视频 | 欧美日韩视频在线观看一区二区三区| 国产精品萝li| 欧美一级日韩一级| 日韩电影一区二区三区四区| 91看片淫黄大片一级在线观看| 精品国产一区二区三区久久影院| 一区二区三区四区在线免费观看| 天堂一区二区在线| 国产精品一线二线三线| 奇米色一区二区三区四区| 国产日韩高清在线| 国产精品色一区二区三区| 中文字幕一区视频| 国产婷婷一区二区| 亚洲欧美色图小说| 欧美日本一道本在线视频| 日韩精品一二三四| 中文字幕一区二区三区视频| 欧美一区二区大片| 日韩精品在线一区| 视频在线观看一区| 欧美美女喷水视频| 丝袜亚洲另类欧美综合| 正在播放亚洲一区| 国产成人精品免费在线| 亚洲成精国产精品女| 久久99热这里只有精品| 91极品视觉盛宴| 亚洲免费观看高清完整版在线观看 | 麻豆一区二区99久久久久| 欧美日韩亚洲综合一区| 国产精品亚洲人在线观看| 国产精品国模大尺度视频| 91福利精品视频| 免费视频一区二区| 欧美色图免费看| 亚洲美女屁股眼交| 成人毛片老司机大片| 精品久久久久久无| 亚洲国产日韩综合久久精品| 国产一区二区精品久久99| 色又黄又爽网站www久久| 欧美另类一区二区三区| 51精品秘密在线观看| 亚洲国产精品传媒在线观看| 国产精品美女久久久久久久| 国产电影一区在线| 综合久久给合久久狠狠狠97色| 精品乱人伦小说| 国产精品久久久久久久久晋中 | 亚洲精品中文在线影院| 国产剧情一区二区三区| 中文字幕制服丝袜一区二区三区| 日本va欧美va欧美va精品| 92精品国产成人观看免费| 91精品国产一区二区三区蜜臀| 亚洲欧美日韩一区二区三区在线观看 | 天天综合色天天| 视频一区视频二区中文字幕| 美国毛片一区二区| av不卡在线观看| 欧美午夜在线观看| 久久精品一二三| 欧美xxxx在线观看| 99v久久综合狠狠综合久久| 久久99精品久久只有精品| 亚洲午夜精品一区二区三区他趣| 欧美视频一区在线| 懂色av一区二区夜夜嗨| 国产成人av一区二区三区在线 | 亚洲欧洲日产国码二区| 在线亚洲一区二区| 亚洲国产精品久久艾草纯爱| 国产欧美一区二区精品久导航 | 一区二区视频在线| 亚洲成人动漫在线观看| 国产福利视频一区二区三区| 国产成人精品一区二| 久久99精品网久久| 午夜精彩视频在线观看不卡| 另类小说图片综合网| 蜜桃久久久久久久| 国内外精品视频| 99久久777色| 欧美日韩精品福利| 国产乱一区二区| 国产一区二区不卡在线| 欧美日韩一区二区在线观看| 美国十次了思思久久精品导航| 成人h版在线观看| 91久久香蕉国产日韩欧美9色| 在线免费观看日本欧美| 国产精品每日更新在线播放网址| 色综合久久综合| 国产乱码精品一品二品| 亚洲精品亚洲人成人网在线播放| 在线观看国产一区二区| 亚洲国产日韩综合久久精品| 国产精品一区二区三区四区| 在线观看精品一区| 久久精品一区二区| 美腿丝袜在线亚洲一区 | 国产一区二区三区蝌蚪| 一区av在线播放| 国内精品伊人久久久久av影院| 一本到三区不卡视频| 国产成人精品一区二区三区四区| 欧美一二三在线| 日韩三级在线免费观看| 麻豆精品一区二区av白丝在线| 日本高清免费不卡视频| 亚洲国产经典视频| 久久久久久久久久久久电影| 久久新电视剧免费观看| 欧美午夜寂寞影院| 欧美综合久久久| 欧美人伦禁忌dvd放荡欲情| 欧美日韩成人综合| 视频在线观看国产精品| 国产在线不卡一区| 亚洲女性喷水在线观看一区| 99九九99九九九视频精品| 亚洲精品日韩综合观看成人91| 另类调教123区| 91麻豆swag| 久久99精品久久只有精品| 亚洲午夜在线观看视频在线| 麻豆成人久久精品二区三区红 | 国产成人福利片| 国产成人综合在线观看| 国产网站一区二区| 日韩欧美在线影院| 久久九九久久九九| 亚洲国产综合视频在线观看| 国产在线播放一区三区四| thepron国产精品| 久久久久久亚洲综合影院红桃| 欧美激情在线一区二区| 精品剧情v国产在线观看在线| 成人激情黄色小说| 粉嫩13p一区二区三区| 成人在线一区二区三区|