Golang 傳遞任意類型的切片

来源:https://www.cnblogs.com/zhuchunyu/archive/2019/07/26/11253400.html
-Advertisement-
Play Games

肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。 就好比這種情況 還有很多類型的切片,但是我對這些切片的使用,只是for迴圈每一個元素,執行Print操作就可以了。 那就定義一個函數,函數的接收參數就是這個切片就行了,但是切片類型太多了,你要根據不同的切片類型,寫不同 ...


肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。

就好比這種情況

intSlice := []int{1,2,3,4,5,6,7,8}
strSlice := []string{"a","b","c","d"}
boolSlice := []bool{true,true,false,true}

還有很多類型的切片,但是我對這些切片的使用,只是for迴圈每一個元素,執行Print操作就可以了。
那就定義一個函數,函數的接收參數就是這個切片就行了,但是切片類型太多了,你要根據不同的切片類型,寫不同從接收參數類型,但是函數體的代碼都是一樣,for迴圈,然後Print就可以。那麼有沒有一種類型,可以接收所有類型的參數呢?

interface{}: 空介面這個類型,他可以接收任意類型的數據

func faa (arg interface{}) {
    fmt.Println(arg)
}

func main() {
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  // 能夠成功輸出,不會報錯
}

但是將faa的函數體改下,執行for操作

func faa (arg interface{}) {
    for _,v := range arg {
        fmt.Println(v)
    }
}

運行程式,會報錯,報錯信息:cannot range over arg (type interface {}), interface {}類型不能進行for迴圈,,那麼[] interface {}這種切片類型就可以進行for了吧,

func faa (arg []interface{}) {
    for _,v := range arg {
        fmt.Println(v)
    }
}

func main() {
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  
}

這樣的情況的話,我們在調用faa函數的時候,已經報錯了,說類型不對,faa的接收參數類型為[]interface{},但我傳遞的參數類型為[]int,[]string,[]bool。所以這樣是不行的。

下麵是解決方法:

  • 首先faa接收的參數類型為 interface{}
  • 將arg進行轉化,轉為[]interface{}
  • 最後進行for迴圈操作

直接貼代碼,我是參考別人的

該博主的博客: https://blog.csdn.net/HaoDaWang/article/details/83931629

// interface{}轉為 []interface{}
func CreateAnyTypeSlice(slice interface{}) ([]interface{}, bool) {
    val, ok := isSlice(slice)

    if !ok {
        return nil, false
    }

    sliceLen := val.Len()

    out := make([]interface{}, sliceLen)

    for i := 0; i < sliceLen; i++ {
        out[i] = val.Index(i).Interface()
    }

    return out, true
}

// 判斷是否為slcie數據
func isSlice(arg interface{}) (val reflect.Value, ok bool) {
    val = reflect.ValueOf(arg)

    if val.Kind() == reflect.Slice {
        ok = true
    }

    return
}


// 看需求寫的代碼
func faa(arg interface{}) {
    slice, ok := CreateAnyTypeSlice(arg)
    if !ok {
        return
    }
    for index,value := range slice {
        fmt.Println(index,value)
    }
}

func main() {
    
    intSlice := []int{1,2,3,4,5,6,7,8}
    strSlice := []string{"a","b","c","d"}
    boolSlice := []bool{true,true,false,true}
    
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 智能家居-1.基於esp8266的語音控制系統(開篇) 智能家居-2.基於esp8266的語音控制系統(硬體篇) 智能家居-3.基於esp8266的語音控制系統(軟體篇) 樹莓派安裝及配置 鏡像文件下載地址 https://www.raspberrypi.org/downloads/ 安裝apach ...
  • 命令行工具 1. jps JVM Process Status Tool,顯示虛擬機進程。 用法 : 參數說明 q:列印進程號 l:列印啟動類的全限定名 m:列印啟動類的 main 方法入參 v:列印指定的虛擬機參數 V:列印類名 例子 : 、`jps l` 2、jstat JVM statisti ...
  • 示例 指的是,以 Server模式啟動,初始堆1024m,最大堆1024m,初始新生代256m,最大新生代512m,列印詳細的GC日誌,並輸出到gc.$$.log。 常見虛擬機參數 client   客戶端模式。 server   服務端模式,Java8 64 ...
  • 一、持久化 --shelve 持久化工具 (1)作用:類似字典,用kv對保存數據,存取方式類似於字典 (2)例子:通過一下案例創建了一個資料庫,第二個程式我們讀取了資料庫 2.shelve特性 (1)註意:不支持多個應用並行寫入,為瞭解決這個問題,open的時候可以使用writeback=True, ...
  • 今天比較晚,所以只看了shiro的認證策略Authentication Strategy,下麵講講shiro的三種認證策略。 1.AtLeastOneSuccessfulStrategy:這個是shiro預設的認證策略,它表示如果存在多個realm來執行認證,只要其中有一個成功,那麼認證就成功(這裡 ...
  • 先說顏色: 綠色:public 黃色:protected 藍色:no modifier 紅色:private 再說形狀: 實心:method 空心:variable 實心中間有字母C:class Class右側有向右的箭頭:運行入口 再說字母: S:static F:final 常用組合: 綠圓圈: ...
  • 基本思想 通過Dlib獲得當前人臉的特征點,然後通過旋轉平移標準模型的特征點進行擬合,計算標準模型求得的特征點與Dlib獲得的特征點之間的差,使用Ceres不斷迭代優化,最終得到最佳的旋轉和平移參數。 使用環境 系統環境:Ubuntu 18.04 使用語言:C++ 編譯工具:CMake 第三方工具 ...
  • 第一次打開PyCharm可能需要修改一些個性化和瞭解一些基本操作,有助於接下來的學習過程.(後續可能會更新) 我的版本是64位的1.3 1.換界麵皮膚 預設黑色的,不喜歡黑色皮膚可以換成白色的 File Settings Appearance&Behavior Appearance Theme 2. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...