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ù)有返回值,但是返回值的類型不定,所以我們的返回值類型只能以接口來代替了。
返回接口類型之后,我們就要對其類型進行判斷然后進行類型轉(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的類型,類型判斷完之后進入相應的case,然后通過reflect.ValueOf(mm)來mm的值取出來,如果mm本身是個數(shù)組的話,那么s也是一個數(shù)組,就可以進行遍歷操作了。
總結(jié)
1、對于我們已知返回值是哪種類型的情況下,可以直接將返回值進行類型轉(zhuǎn)換,像上面那種轉(zhuǎn)為普通類型的方法一樣。
2、對于返回值類型不是已知的情況下,可以考慮使用reflect.TypeOf()的方式。
補充:golang interface{}轉(zhuǎn)換成struct結(jié)構體的兩種方法
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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 淺談Golang 嵌套 interface 的賦值問題
- Golang 實現(xiàn)interface類型轉(zhuǎn)string類型
- 解決golang 反射interface{}做零值判斷的一個重大坑
- 基于go interface{}==nil 的幾種坑及原理分析
- golang interface判斷為空nil的實現(xiàn)代碼
- 詳解Golang語言中的interface
- 使用go的interface案例實現(xiàn)多態(tài)范式操作
- go 類型轉(zhuǎn)換方式(interface 類型的轉(zhuǎn)換)