📜  Golang中查找对象类型的不同方法

📅  最后修改于: 2021-10-24 14:07:11             🧑  作者: Mango

Go没有类类型的概念,因此,Go 中没有对象。您可以将 Go 中的任何数据类型称为对象。 Go 提供了多种数据类型,例如 int8、int16、int32、int64、float64、 字符串、bool 等。在 Go 中,您可以通过三种不同的方式在运行时找到变量的类型。

1. 使用 fmt 进行字符串类型描述

fmt 包中的%T是值类型的 Go 语法表示。您可以使用 %T 来查找变量类型。

句法:

func typeofobject(x interface{}) {
    fmt.Sprintf("%T", x)
}

示例 1:

// Golang program to find the variable type
package main
  
// importing required packages
import (
    "fmt"
)
  
// main function
func main() {
    f := true
    st := ""
    a := 1
    d := 1.0
    arr := []string{"Go", "Is", "Fun"}
  
    fmt.Printf("%T\n", f)
    fmt.Printf("%T\n", st)
    fmt.Printf("%T\n", a)
    fmt.Printf("%T\n", d)
    fmt.Printf("%T\n", arr)
}

输出:

bool
string
int
float64
[]string

示例 2:

// Golang program to show how to find
// the type of an object
package main
  
// importing required packages
import (
    "fmt"
)
  
func main() {
    types := []interface{}{"Code", 10, true, 10.55}
    for _, x := range types {
        fmt.Printf("%T\n", x)
    }
}

输出:

string
int
bool
float64

注意:用 interface{} 表示的空接口可用于保存任何类型的值。

2. 使用反射包

您还可以使用实现运行时反射的反射包,从而允许程序操作任意类型的对象。 reflect.TypeOfreflect.ValueOf(x).Kind()函数帮助我们找到所需的变量类型。

句法:

func typeofobject(x interface{}){
    fmt.Println(reflect.TypeOf(x))
}

要么

func typeofobject(x interface{}){
    fmt.Println(reflect.ValueOf(x).Kind())
}

示例 1:

// Golang program to demonstrate
// the use of reflect.TypeOf function
package main
  
//importing reflect package
import (
    "fmt"
    "reflect"
)
  
func main() {
    f := true
    st := ""
    a := 1
    d := 1.0
    arr := []string{"Go", "Is", "Fun"}
  
    fmt.Println(reflect.TypeOf(f))
    fmt.Println(reflect.TypeOf(st))
    fmt.Println(reflect.TypeOf(a))
    fmt.Println(reflect.TypeOf(d))
    fmt.Println(reflect.TypeOf(arr))
}

输出:

bool
string
int
float64
[]string

我们可以使用 ValueOf().Kind()函数类似地做到这一点。

示例 2:

// Golang program to demonstrate
// the use of reflect.ValueOf(x).Kind() function
package main
  
import (
    "fmt"
    "reflect"
)
  
func main() {
    f := true
    st := ""
    a := 1
    d := 1.0
    arr := []string{"Coding", "In", "Go"}
  
    fmt.Println(reflect.ValueOf(f).Kind())
    fmt.Println(reflect.ValueOf(st).Kind())
    fmt.Println(reflect.ValueOf(a).Kind())
    fmt.Println(reflect.ValueOf(d).Kind())
    fmt.Println(reflect.ValueOf(arr).Kind())
}

输出:

bool
string
int
float64
slice

示例 3:

package main
  
// importing required packages
import (
    "fmt"
    "reflect"
)
  
func main() {
    types := []interface{}{"Code", true, 5, 3.14, []int{1, 2, 3, 4}}
    for _, x := range types {
        fmt.Println(reflect.ValueOf(x).Kind())
    }
}

输出:

string
bool
int
float64
slice

3. 使用类型断言

您可以使用类型开关来执行多个类型断言。类型开关串联使用多个类型断言并运行第一个匹配类型。在这个 switch 中,case 包含将与 switch 表达式中存在的类型进行比较的类型,如果没有一个 case 匹配,则评估 default case。

句法:

switch optstatement; typeswitchexpression{
case typelist 1: Statement..
case typelist 2: Statement..
...
default: Statement..
}

例子:

// Golang program to check the object type
// using type switch
package main
  
//importing required packages
import (
    "fmt"
)
  
func main() {
    types := []interface{}{"Code", true, 5, 3.14, []int{1, 2, 3}}
  
    for _, x := range types {
        // type switch with multiple cases
        switch x.(type) {
        case int:
            fmt.Println("int:", x)
        case float64:
            fmt.Println("float64:", x)
        case string:
            fmt.Println("string:", x)
        case bool:
            fmt.Println("bool:", x)
        default:
            fmt.Printf("data type: %T", x)
        }
    }
}

输出:

string: Code
bool: true
int: 5
float64: 3.14
data type: []int