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.TypeOf和reflect.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