成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 泛型玩出花,詳解新提案 Switch Type!

開發 后端
新的提案內容是希望增加一個新的變種語句,允許在 switch 語句的類型中使用泛型時,能夠進一步便捷的約束其類型參數。

[[440023]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

前面寫過好幾篇 Go 泛型的語法、案例介紹,新的一手 Go 消息。實際上,隨著一些提案被接受,新的提案也逐漸冒出。

這不,我發現有了泛型后,大家可以更進一步玩出花來了。看到了一個 ”新“ 提案《proposal: spec: generics: type switch on parametric types[1]》,講的就是增加泛型后的參數類型上的類型開關訴求。

跟著煎魚一起掌握新的 Go 知識吧!

新提案

新的提案內容是希望增加一個新的變種語句,允許在 switch 語句的類型中使用泛型時,能夠進一步便捷的約束其類型參數。

例如:

  1. switch type T { 
  2. case A1: 
  3. case A2, A3: 
  4.    ... 

也就是 switch-type 語句的 T 類型可以是一個泛型的類型參數,case 所對應的的類型可以是任何類型,包括泛型的約束類型。

假設類型 T 的類型有可能是以下類型:

  1. interface{ 
  2.     C 
  3.     A 

可以借助泛型的近似元素來約束:

  1. interface{ 
  2.     C 
  3.     A1 | A2 | ... | An 

甚至還可以在 case 上有新的寫法:

  1. case interface {~T}: 

在支持泛型后,switch 在 type 和 case 上會存在很多種可能性,需要進行具體的特性支持,這個提案就是為此出現。

實際案例

案例一:多類型元素

  1. type Stringish interface { 
  2.  string | fmt.Stringer 
  3.  
  4. func Concat[S Stringish](x []S "S Stringish") string { 
  5.     switch type S { 
  6.     case string: 
  7.         ... 
  8.     case fmt.Stringer: 
  9.         ... 
  10.     } 
  11.  } 

類型 S 能夠支持 string 和 fmt.Stringer 類型,case 配套對應實現。

案例二:近似元素

  1. type Constraint interface { 
  2.     ~int | ~int8 | ~string 
  3.  
  4. func ThisSyntax[T Constraint]( "T Constraint") { 
  5.     switch type T { 
  6.     case ~int | ~int8: 
  7.         ... 
  8.     case ~string: 
  9.         ... 
  10.     } 
  11.  
  12. func IsClearerThanThisSyntax[T Constraint]( "T Constraint") { 
  13.     switch type T { 
  14.     case interface{~int | ~int8 }: 
  15.         ... 
  16.     case interface{ ~string }: 
  17.         ... 
  18.     } 

類型 T 可能有很多類型,程序中用到了近似元素,也就是基礎類型是 int、int8、string,這些類型中的任何一種都能夠滿足這個約束。

為此,switch-type 支持了,case 也要配套支持該特性。

爭議點

看到這里可能大家也想到了,這個味道很似曾相識,好像某個語法能夠支持。因此,這個提案下最有爭議的,就是與原有的類型斷言的重復。

原有的類型斷言如下:

  1. switch T.(type) { 
  2. case string: 
  3.    ... 
  4. default
  5.    ... 

新的類型判別如下:

  1. switch type T { 
  2. case A1: 
  3. case A2, A3: 
  4.    ... 

這么咋一看,其實類型斷言的完全可以取代新的,那豈不是重復建設,造輪子了?

其實是沒有完全取代的。差異點如下:

  1. type ApproxString interface { ~string } 
  2.  
  3. func F[T ApproxString](v T "T ApproxString") { 
  4.     switch (interface{})(v).(type) { 
  5.     case string: 
  6.         fmt.Println(v) 
  7.     default
  8.         panic("腦子沒進煎魚"
  9.     } 
  10.  
  11. type MyString string 
  12.  
  13. func main() { 
  14.     F(MyString("腦子進煎魚了"))  

看出來差別在哪了嗎,答案是什么?

答案是:會拋出恐慌(panic)。

你可能糾結了,問題出在哪里?這傳入的 ”腦子進煎魚了“ 的類型是 MyString,他的基礎類型是 string 類型,也滿足 ApproxString 類型的近似類型 ~string 的要求,怎么就不行了...

根本原因是因為他的類型是 interface,而非 string 類型。所以走到了 defalut 分支的恐慌。

總結

今天給大家介紹了 Go 泛型的最新消息,在上一個提案被合并后,該提案也有一些新的動靜,不過 Go 官方表態,會等熟練掌握泛型實踐后,再繼續推動該提案。

我相信原有的 switch.(type) 和 switch type 很大概率在 Go 底層會變成同一個邏輯塊處理,再逐漸過渡。

這個提案的目的還是為了解決若干引入泛型后,所帶入的 BUG/需求,正正是需要新的語法結構來解決的。

你對此有什么看法呢,歡迎在評論區留言和交流:)

參考資料

[1]proposal: spec: generics: type switch on parametric types: https://github.com/golang/go/issues/45380

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-08-09 10:36:20

GoSlices Maps

2021-01-14 05:20:48

Go語言泛型

2011-03-21 16:26:28

java泛型

2024-10-28 00:40:49

Go語法版本

2021-02-05 16:26:08

Go開發者提案

2021-12-14 10:54:31

TopK面試排序法

2021-09-29 18:17:30

Go泛型語言

2021-02-25 15:51:41

Go語言模糊測試功能

2025-04-14 08:49:10

2023-12-27 08:03:53

Go優化代碼

2021-06-18 08:25:42

Java泛型通配符

2021-08-04 12:26:00

Postman工具頻率

2022-11-15 09:16:59

2021-11-27 22:20:13

SlicesGo泛型

2023-11-03 14:02:04

Go切片泛型庫

2022-03-28 13:34:26

Go泛型部署泛型

2023-11-29 08:19:45

Go泛型缺陷

2011-04-13 09:16:55

泛型

2025-02-08 11:00:33

2024-11-19 09:10:19

迭代器Go語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产做a爱片久久毛片 | 久草视频观看 | 国产一区91精品张津瑜 | 一区二区三区免费 | 精品在线一区二区三区 | 一级毛片网 | 国产成人精品一区 | 久久久久久久久久一区二区 | 精品国产乱码久久久久久久久 | 天天搞天天操 | 日韩精品久久 | 91国内产香蕉 | 国产欧美日韩一区二区三区 | 欧美性久久 | 亚洲精品自拍视频 | 精品欧美一区二区三区精品久久 | 国产一区久久 | 天天色影视综合 | 成人h视频在线 | 91免费版在线观看 | 99riav国产一区二区三区 | 国产欧美久久精品 | 午夜在线视频 | 久草在线在线精品观看 | 曰批视频在线观看 | 欧美一区二区三区 | 在线观看免费国产 | 日韩在线欧美 | 日干夜干| 黄色一级大片视频 | 丁香色婷婷 | 91麻豆蜜桃一区二区三区 | 天堂av免费观看 | 99re热精品视频 | 国产成人精品免费视频大全最热 | 免费的色网站 | 能免费看的av | 亚洲精品一区二区三区蜜桃久 | a视频在线观看 | 久久久久久影院 | 成人在线精品视频 |