濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Golang中interface{}轉(zhuǎn)為數(shù)組的操作

Golang中interface{}轉(zhuǎn)為數(shù)組的操作

熱門(mén)標(biāo)簽:excel地圖標(biāo)注分布數(shù)據(jù) 評(píng)價(jià)高的400電話辦理 百度地圖標(biāo)注后傳給手機(jī) 壽光微信地圖標(biāo)注 阿克蘇地圖標(biāo)注 外呼系統(tǒng)顯本地手機(jī)號(hào) 電話機(jī)器人軟件免費(fèi) 外呼系統(tǒng)用什么卡 涿州代理外呼系統(tǒng)

interface{} 轉(zhuǎn)為普通類型

我們都知道在golang中interface{}可以代表任何類型,對(duì)于像int64、bool、string等這些簡(jiǎn)單類型,interface{}類型轉(zhuǎn)為這些簡(jiǎn)單類型時(shí),直接使用

p, ok := t.(bool)
p, ok := t.(int64)

如果ok==true的話,就已經(jīng)類型轉(zhuǎn)換成功。

假設(shè)有這樣一個(gè)場(chǎng)景,我們有一個(gè)函數(shù)有返回值,但是返回值的類型不定,所以我們的返回值類型只能以接口來(lái)代替了。

返回接口類型之后,我們就要對(duì)其類型進(jìn)行判斷然后進(jìn)行類型轉(zhuǎn)換。如果返回的是數(shù)組的話,我們就不能像上面那樣直接進(jìn)行轉(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ù)有兩個(gè)返回值,一個(gè)是接口類型,一個(gè)是bool類型。

我們只對(duì)第一個(gè)參數(shù)進(jìn)行處理,首先使用reflect.TypeOf(mm).Kind()獲得mm的類型,然后采用switch語(yǔ)句來(lái)判斷mm的類型,類型判斷完之后進(jìn)入相應(yīng)的case,然后通過(guò)reflect.ValueOf(mm)來(lái)mm的值取出來(lái),如果mm本身是個(gè)數(shù)組的話,那么s也是一個(gè)數(shù)組,就可以進(jìn)行遍歷操作了。

總結(jié)

1、對(duì)于我們已知返回值是哪種類型的情況下,可以直接將返回值進(jìn)行類型轉(zhuǎn)換,像上面那種轉(zhuǎn)為普通類型的方法一樣。

2、對(duì)于返回值類型不是已知的情況下,可以考慮使用reflect.TypeOf()的方式。

補(bǔ)充:golang interface{}轉(zhuǎn)換成struct結(jié)構(gòu)體的兩種方法

1.使用斷言,強(qiáng)制轉(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
 }

實(shí)例:

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é)果:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 淺談Golang 嵌套 interface 的賦值問(wèn)題
  • Golang 實(shí)現(xiàn)interface類型轉(zhuǎn)string類型
  • 解決golang 反射interface{}做零值判斷的一個(gè)重大坑
  • 基于go interface{}==nil 的幾種坑及原理分析
  • golang interface判斷為空nil的實(shí)現(xiàn)代碼
  • 詳解Golang語(yǔ)言中的interface
  • 使用go的interface案例實(shí)現(xiàn)多態(tài)范式操作
  • go 類型轉(zhuǎn)換方式(interface 類型的轉(zhuǎn)換)

標(biāo)簽:重慶 梅河口 雞西 銅川 欽州 蘭州 吐魯番 汕頭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang中interface{}轉(zhuǎn)為數(shù)組的操作》,本文關(guān)鍵詞  Golang,中,interface,轉(zhuǎn)為,數(shù)組,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang中interface{}轉(zhuǎn)為數(shù)組的操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Golang中interface{}轉(zhuǎn)為數(shù)組的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    桂林市| 湛江市| 象州县| 曲靖市| 西盟| 龙里县| 大悟县| 沽源县| 镇巴县| 东乡族自治县| 扶余县| 吴忠市| 崇文区| 乌鲁木齐县| 连山| 繁昌县| 舟山市| 荃湾区| 福建省| 托克逊县| 鄂伦春自治旗| 环江| 富宁县| 斗六市| 罗甸县| 万山特区| 措勤县| 丹棱县| 汨罗市| 克拉玛依市| 老河口市| 梅河口市| 新邵县| 游戏| 杭锦旗| 原平市| 高陵县| 阿坝| 万载县| 新兴县| 综艺|