go泛型體驗

背景

有了泛型可以做到復(fù)用,比如sort,filter,map,reduce等常用方法,這里舉個ch的例子
我們寫go時候經(jīng)常會進(jìn)行ch的fanin,fanout操作,但是沒有泛型時候,沒辦法寫針對任何類型的(類型安全,不考慮類型安全的話可以傳入interface{}然后通過反射來做到)

例子


package main

import (
    "fmt"
    "reflect"
)

func FanOut[T any](chs ...chan T) chan<- T {
    ret := make(chan T)
    recvChValue := reflect.ValueOf(ret)
    sendChValues := make([]reflect.Value, 0, len(chs))
    for _, ch := range chs {
        value := reflect.ValueOf(ch)
        sendChValues = append(sendChValues, value)
    }
    go func() {
        for {
            value, ok := recvChValue.Recv()
            for _, sendChValue := range sendChValues {
                if !ok {
                    sendChValue.Close()
                    continue
                }
                sendChValue.Send(value)
            }

            if !ok {
                return
            }
        }
    }()
    return ret
}

func FanIn[T any](chs ...chan T) <-chan T {
    ret := make(chan T)
    cases := make([]reflect.SelectCase, 0, len(chs))
    for _, ch := range chs {
        value := reflect.ValueOf(ch)
        item := reflect.SelectCase{
            Dir:  reflect.SelectRecv,
            Chan: value,
        }
        cases = append(cases, item)
    }
    go func() {
        for {
            chosen, recvValue, ok := reflect.Select(cases)
            if !ok {
                curCases := make([]reflect.SelectCase, 0, len(chs))
                for idx, each := range cases {
                    if chosen == idx {
                        curCases = append(curCases, cases[idx+1:]...)
                        break
                    }
                    curCases = append(curCases, each)
                }
                if len(curCases) == 0 {
                    close(ret)
                    return
                }

                cases = curCases
                continue
            }

            ret <- recvValue.Interface().(T)
        }
    }()
    return ret
}

func main() {
    fanInCh1 := make(chan int, 1)
    fanInCh2 := make(chan int, 1)
    fanInCh := FanIn(fanInCh1, fanInCh2)
    fanInCh1 <- 1
    fmt.Println(<-fanInCh)
    fanInCh2 <- 2
    fmt.Println(<-fanInCh)
    close(fanInCh1)
    fanInCh2 <- 3
    fmt.Println(<-fanInCh)
    close(fanInCh2)
    fmt.Println(<-fanInCh)

    fanOutCh1 := make(chan int, 1)
    fanOutCh2 := make(chan int, 1)
    fanOutCh := FanOut(fanOutCh1, fanOutCh2)
    fanOutCh <- 1
    fmt.Println(<-fanOutCh1, <-fanOutCh2)
    close(fanOutCh)
    fmt.Println(<-fanOutCh1, <-fanOutCh2)

}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袍冷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猫牡,更是在濱河造成了極大的恐慌胡诗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淌友,死亡現(xiàn)場離奇詭異煌恢,居然都是意外死亡,警方通過查閱死者的電腦和手機震庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門瑰抵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人器联,你說我怎么就攤上這事二汛⌒稣福” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵肴颊,是天一觀的道長氓栈。 經(jīng)常有香客問我,道長婿着,這世上最難降的妖魔是什么授瘦? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮竟宋,結(jié)果婚禮上提完,老公的妹妹穿的比我還像新娘。我一直安慰自己丘侠,他們只是感情好氯葬,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婉陷,像睡著了一般帚称。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秽澳,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天闯睹,我揣著相機與錄音,去河邊找鬼担神。 笑死楼吃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妄讯。 我是一名探鬼主播孩锡,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亥贸!你這毒婦竟也來了躬窜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炕置,失蹤者是張志新(化名)和其女友劉穎荣挨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴摊,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡默垄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甚纲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口锭。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖介杆,靈堂內(nèi)的尸體忽然破棺而出鹃操,到底是詐尸還是另有隱情况既,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布组民,位于F島的核電站棒仍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臭胜。R本人自食惡果不足惜莫其,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耸三。 院中可真熱鬧乱陡,春花似錦、人聲如沸仪壮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽积锅。三九已至爽彤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缚陷,已是汗流浹背适篙。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箫爷,地道東北人嚷节。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像虎锚,于是被迫代替她去往敵國和親硫痰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 原文地址:https://go.googlesource.com/proposal/+/refs/heads/ma...
    豆腐匠閱讀 709評論 0 0
  • 對于很多剛接觸java語言的初學(xué)者來說窜护,要了解一門語言效斑,最好的方式就是要能從基礎(chǔ)的版本進(jìn)行了解,升級的過程柄慰,以及升...
    timothyue1閱讀 262評論 0 1
  • 泛型 本文原文[https://mp.weixin.qq.com/s/msiA1YTjViTMxnr5TsfskQ...
    科科人神閱讀 2,025評論 0 0
  • 原鏈接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把愛放下會走更遠(yuǎn)閱讀 1,114評論 0 10
  • 在 Go1.17 中鳍悠,千呼萬喚的泛型終于出來了税娜,但又沒有完全出來坐搔。在 Go1.17 的發(fā)布文檔中,并沒有提到泛型敬矩,...
    rayjun閱讀 5,030評論 0 5