1. 程式人生 > >golang型別檢測

golang型別檢測

要求是對任意的輸入型別,對其進行要求的型別的檢測,防止不正確的引數輸入到後續的函式中

package main

import (
"fmt"
"reflect"
)

func main(){
var a int=8;
var b string="as"
Vaild(a,"string")
Vaild(b,"string")
}

func Vaild(params interface{},t string) bool {
var returnbool bool = false
paramsType := reflect.TypeOf(params)
fmt.Println(params)
fmt.Println(paramsType)
fmt.Println(t)
//if paramsType == t {
// returnbool = true
//}
fmt.Println(returnbool)
return returnbool
}
8
int
string
false
as
string
string
false

因為輸入可能為任意型別,所以用interface{},在作為函式形參時,可以接受不同型別的引數。

但是interface{}不能直接取值,只能通過reflect反射取出其中的型別或值,

但是通過reflect.TypeOf取出型別後仍然無法進行判斷報錯invalid operation: paramsType == t (mismatched types reflect.Type and string)

// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.

func TypeOf(i interface{}) Type {
	eface := *(*emptyInterface)(unsafe.Pointer(&i))
	return toType(eface.typ)
}

翻譯過來就是:TypeOf用來動態獲取輸入引數介面中的值的型別,如果介面值為空就返回nil

雖然輸出都是string但是反射出的實際型別還是不一樣的,這裡的type是反射物件型別,而不是平時具體的type,所以無法進行判斷,

而為了完成我們的目標,我們還要多增加一步操作

package main

import (
"fmt"
	"reflect"
)

func main(){
var a int=8;
var b string="as"
Vaild(a,"string")
Vaild(b,"string")
}

func Vaild(params interface{},t string) bool {
	var returnbool bool = false
	ParamsType := reflect.TypeOf(params)
	ParamsType_String := ParamsType.String()
	fmt.Println(params)
	fmt.Println(ParamsType)
	fmt.Println(ParamsType_String)
	fmt.Println(t)
	if ParamsType_String == t {
		returnbool = true
	}
	fmt.Println(returnbool)
	return returnbool
}

只需要增加一個型別轉換即可完成

int
string
false
as
string
string
string
true

這樣就完成了明確要求的型別判斷

這裡的一個主要目的就是介面型別的理解和反射的理解應用

每個interface變數都有一個對應pair,pair中記錄了實際變數的值和型別:

(value,type)

其實value是實際變數的值,type是實際變數的型別。

一個interface{}型別的變數包含了2個指標,一個指標指向值的型別,另外一個指標指向實際的值。

reflect.TypeOf和reflect.ValueOf兩個對應的反射取到的資料型別是type Type和type Values,

仍然需要進一步處理才可以繼續使用。