Golang中interface{}轉(zhuǎn)為數(shù)組的操作
interface{} 轉(zhuǎn)為普通類型
我們都知道在golang中interface{}可以代表任何類型,對于像int64、bool、string等這些簡單類型,interface{}類型轉(zhuǎn)為這些簡單類型時,直接使用
p, ok := t.(bool) p, ok := t.(int64)
如果ok==true的話,就已經(jīng)類型轉(zhuǎn)換成功。
假設(shè)有這樣一個場景,我們有一個函數(shù)有返回值,但是返回值的類型不定,所以我們的返回值類型只能以接口來代替了。
返回接口類型之后,我們就要對其類型進行判斷然后進行類型轉(zhuǎn)換。如果返回的是數(shù)組的話,我們就不能像上面那樣直接進行轉(zhuǎn)換了。
那有什么辦法呢?
可以考慮使用reflect.Typeof(mm).Kind()。
func generate() (interface{}, bool) { //s := []string{"123", "345", "abc"} //s := 123 s := "mmm" return s, true } func test() { origin, ok := generate() if ok { switch reflect.TypeOf(origin).Kind() { case reflect.Slice, reflect.Array: s := reflect.ValueOf(origin) for i := 0; i < s.Len(); i++ { fmt.Println(s.Index(i)) } case reflect.String: s := reflect.ValueOf(origin) fmt.Println(s.String(), "I am a string type variable.") case reflect.Int: s := reflect.ValueOf(origin) t := s.Int() fmt.Println(t, " I am a int type variable.") } } }
generate()函數(shù)有兩個返回值,一個是接口類型,一個是bool類型。
我們只對第一個參數(shù)進行處理,首先使用reflect.TypeOf(mm).Kind()獲得mm的類型,然后采用switch語句來判斷mm的類型,類型判斷完之后進入相應(yīng)的case,然后通過reflect.ValueOf(mm)來mm的值取出來,如果mm本身是個數(shù)組的話,那么s也是一個數(shù)組,就可以進行遍歷操作了。
總結(jié)
1、對于我們已知返回值是哪種類型的情況下,可以直接將返回值進行類型轉(zhuǎn)換,像上面那種轉(zhuǎn)為普通類型的方法一樣。
2、對于返回值類型不是已知的情況下,可以考慮使用reflect.TypeOf()的方式。
補充:golang interface{}轉(zhuǎn)換成struct結(jié)構(gòu)體的兩種方法
1.使用斷言,強制轉(zhuǎn)換
p, ok := (Value).(user) if ok { fmt.Println("id:" + p.Id) fmt.Println("name:" + p.Name) } else { fmt.Println("can not convert") }
2.json序列化
resByre,resByteErr:=json.Marshal(ResponseData) if resByteErr != nil { c.Data(utils.ErrorResult("讀取信息失敗" + resByteErr.Error())) return } var newData MnConfig jsonRes:=json.Unmarshal(resByre,&newData) if jsonRes != nil { c.Data(utils.ErrorResult("讀取信息失敗" + jsonRes.Error())) return }
實例:
package main import ( "encoding/json" "fmt" ) type user struct { Id int `json:"id"` Name string `json:"name"` } func main() { newUser:=user{ Id: 1, Name: "杉杉", } var newInterface1 interface{} //第一種使用interface newInterface1=newUser fmt.Printf("使用interface: %v",newInterface1.(user)) //第二種使用json var newInterface2 interface{} newInterface2=newUser resByre, resByteErr := json.Marshal(newInterface2) if resByteErr != nil { fmt.Printf("%v",resByteErr) return } var newData user jsonRes := json.Unmarshal(resByre, &newData) if jsonRes != nil { fmt.Printf("%v",jsonRes) return } fmt.Printf("使用 json: %v",newData) }
結(jié)果:
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
在 Golang 中實現(xiàn) Cache::remember 方法詳解
這篇文章主要介紹了在 Golang 中實現(xiàn) Cache::remember 方法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Go語言利用ffmpeg轉(zhuǎn)hls實現(xiàn)簡單視頻直播
這篇文章主要為大家介紹了Go語言利用ffmpeg轉(zhuǎn)hls實現(xiàn)簡單視頻直播,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解
這篇文章主要為大家介紹了Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等
這篇文章主要為大家介紹了go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Go Resiliency庫中timeout實現(xiàn)原理及源碼解析
Go-Resiliency庫中的timeout是一種基于協(xié)程的超時機制,通過創(chuàng)建協(xié)程來執(zhí)行任務(wù)并設(shè)置超時時間,若任務(wù)執(zhí)行時間超時則中止協(xié)程并返回錯誤,需要詳細(xì)了解可以參考下文2023-05-05利用Go語言快速實現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng)
任務(wù)調(diào)度(Task Scheduling)是很多軟件系統(tǒng)中的重要組成部分,字面上的意思是按照一定要求分配運行一些通常時間較長的腳本或程序。本文將利用Go語言快速實現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng),感興趣的可以了解一下2022-10-10golang 如何用反射reflect操作結(jié)構(gòu)體
這篇文章主要介紹了golang 用反射reflect操作結(jié)構(gòu)體的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04