<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用 Go 反射機制實現(xiàn)判斷 slice 中是否存在某個 item

          共 812字,需瀏覽 2分鐘

           ·

          2020-08-30 23:57

          點擊上方藍色“Go語言中文網(wǎng)”關注我們,領全套Go資料,每天學習?Go?語言

          為什么需要?

          日常開發(fā)過程中經(jīng)常遇到需要判斷某個 slice(或者 array)中是否包含某個 item 的情況,比如判斷 10 是否在[]int{1,2,3}中

          怎么做?

          一般最容易想到的方法是遍歷 slice 中的每個元素,直到找到了該元素,否則返回 false,如下:

          package?main

          func?IsInSlice(value?int,?sli?[]int)?bool?{
          ????for?_,?v?:=?range?sli?{
          ?????if?value?==?v?{
          ??????return?true
          ?????}
          ????}
          ????return?false
          }

          這種方法實現(xiàn)略顯笨拙,并且針對不同的數(shù)據(jù)類型無法通用,如果有不同的數(shù)據(jù)類型,則容易生成很多相同功能的函數(shù),只是參數(shù)不同,這樣的話代碼可用性并不高。

          如何改進

          golang 中可以通過 reflect 包中的 TypeOf(), ValueOf()和 DeepEqual()接口對方法進行改進,方法參數(shù)使用 interface{}類型,代碼實現(xiàn)如下:

          package?main

          import?"reflect"

          func?IsInSlice(value?interface{},?sli?interface{})?bool?{
          ????switch?reflect.TypeOf(sli).Kind()?{
          ????case?reflect.Slice,?reflect.Array:
          ?????s?:=?reflect.ValueOf(sli)
          ?????for?i?:=?0;?i???????if?reflect.DeepEqual(value,?s.Index(i).Interface())?{
          ???????return?true
          ??????}
          ?????}
          ????}
          ????return?false
          }

          瞬間不用再為不同數(shù)據(jù)類型需要寫不同函數(shù)而心煩了!

          提示

          因為反射需要的時間開銷比較大,所以通用寫法的效率肯定比特定類型的寫法低,所以需要根據(jù)實際情況來權衡使用,如下截圖為 int 類型的基準測試:

          原文作者:pyihe

          原文鏈接:https://pyihe.github.io/2020/05/29/Golang%E5%88%A4%E6%96%ADslice%E4%B8%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E6%9F%90%E4%B8%AAitem.html



          推薦閱讀


          學習交流 Go 語言,掃碼回復「進群」即可


          站長 polarisxu

          自己的原創(chuàng)文章

          不限于 Go 技術

          職場和創(chuàng)業(yè)經(jīng)驗


          Go語言中文網(wǎng)

          每天為你

          分享 Go 知識

          Go愛好者值得關注


          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大黄网站在线观看 | 波多野结衣无码精品一区 | 国语毛片| 男同精品一区二区三区 | 天天射天天插天天舔天天日天天操天天爽 |