Как найти тип объекта в Go?
Как найти тип объекта в Go? В Python я просто использую typeof
для выбора типа объекта. Точно так же в Go, есть ли способ реализовать то же самое?
Вот контейнер, из которого я повторяю:
for e := dlist.Front(); e != nil; e = e.Next() {
lines := e.Value
fmt.Printf(reflect.TypeOf(lines))
}
Я не могу получить тип объектов в этом случае, который представляет собой массив строк.
Ответы
Ответ 1
В пакете отражения Go есть методы для проверки типа переменных.
Следующий фрагмент напечатает тип отражения строки, целого числа и float.
package main
import (
"fmt"
"reflect"
)
func main() {
tst := "string"
tst2 := 10
tst3 := 1.2
fmt.Println(reflect.TypeOf(tst))
fmt.Println(reflect.TypeOf(tst2))
fmt.Println(reflect.TypeOf(tst3))
}
см. http://play.golang.org/p/XQMcUVsOja, чтобы просмотреть его в действии.
Дополнительная документация здесь: http://golang.org/pkg/reflect/#Type
Ответ 2
Я нашел 3 способа вернуть тип переменной во время выполнения:
Использование форматирования строки
func typeof(v interface{}) string {
return fmt.Sprintf("%T", v)
}
Использование отражать пакет
func typeof(v interface{}) string {
return reflect.TypeOf(v).String()
}
Использование утверждений типа
func typeof(v interface{}) string {
switch v.(type) {
case int:
return "int"
case float64:
return "float64"
//... etc
default:
return "unknown"
}
}
У каждого метода свой лучший вариант использования:
форматирование строки - короткая и низкая занимаемая площадь (нет необходимости импортировать отражающий пакет)
отражать пакет - когда нам нужно больше информации о типе, у нас есть доступ к полным возможностям отражения
утверждения типа - позволяет группировать типы, например, распознавать все типы int32, int64, uint32, uint64 как "int"
Ответ 3
Используйте пакет отражения:
Пакет отражает реализует отражение во время выполнения, позволяя программе манипулировать объектами с произвольными типами. Типичное использование - использовать значение с помощью интерфейса статического типа {} и извлекать его информацию о динамическом типе, вызывая TypeOf, который возвращает тип.
package main
import (
"fmt"
"reflect"
)
func main() {
b := true
s := ""
n := 1
f := 1.0
a := []string{"foo", "bar", "baz"}
fmt.Println(reflect.TypeOf(b))
fmt.Println(reflect.TypeOf(s))
fmt.Println(reflect.TypeOf(n))
fmt.Println(reflect.TypeOf(f))
fmt.Println(reflect.TypeOf(a))
}
Производит:
bool
string
int
float64
[]string
Детская площадка
Пример использования ValueOf(i interface{}).Kind()
:
package main
import (
"fmt"
"reflect"
)
func main() {
b := true
s := ""
n := 1
f := 1.0
a := []string{"foo", "bar", "baz"}
fmt.Println(reflect.ValueOf(b).Kind())
fmt.Println(reflect.ValueOf(s).Kind())
fmt.Println(reflect.ValueOf(n).Kind())
fmt.Println(reflect.ValueOf(f).Kind())
fmt.Println(reflect.ValueOf(a).Index(0).Kind()) // For slices and strings
}
Производит:
bool
string
int
float64
string
Детская площадка
Ответ 4
Чтобы получить строковое представление:
От http://golang.org/pkg/fmt/
% T a Го-синтаксическое представление типа значения
package main
import "fmt"
func main(){
types := []interface{} {"a",6,6.0,true}
for _,v := range types{
fmt.Printf("%T\n",v)
}
}
Выходы:
string
int
float64
bool
Ответ 5
Я бы держался подальше от размышлений. пакет. Вместо этого используйте% T
package main
import (
"fmt"
)
func main() {
b := true
s := ""
n := 1
f := 1.0
a := []string{"foo", "bar", "baz"}
fmt.Printf("%T\n", b)
fmt.Printf("%T\n", s)
fmt.Printf("%T\n", n)
fmt.Printf("%T\n", f)
fmt.Printf("%T\n", a)
}
Ответ 6
Лучший способ - использовать концепцию отражения в Google.
reflect.TypeOf
задает тип вместе с именем пакета
reflect.TypeOf().Kind()
дает подчеркивание типа
Ответ 7
Короче говоря, используйте fmt.Printf("%T", var1)
или другие варианты в пакете fmt.
Ответ 8
Чтобы получить тип полей в структуре
package main
import (
"fmt"
"reflect"
)
type testObject struct {
Name string
Age int
Height float64
}
func main() {
tstObj := testObject{Name: "yog prakash", Age: 24, Height: 5.6}
val := reflect.ValueOf(&tstObj).Elem()
typeOfTstObj := val.Type()
for i := 0; i < val.NumField(); i++ {
fieldType := val.Field(i)
fmt.Printf("object field %d key=%s value=%v type=%s \n",
i, typeOfTstObj.Field(i).Name, fieldType.Interface(),
fieldType.Type())
}
}
Выход
object field 0 key=Name value=yog prakash type=string
object field 1 key=Age value=24 type=int
object field 2 key=Height value=5.6 type=float64
см. в IDE https://play.golang.org/p/bwIpYnBQiE
Ответ 9
Вы можете проверить тип любой переменной/экземпляра во время выполнения либо с помощью функции "отражать" пакеты TypeOf
либо с помощью fmt.Printf()
:
package main
import (
"fmt"
"reflect"
)
func main() {
value1 := "Have a Good Day"
value2 := 50
value3 := 50.78
fmt.Println(reflect.TypeOf(value1 ))
fmt.Println(reflect.TypeOf(value2))
fmt.Println(reflect.TypeOf(value3))
fmt.Printf("%T",value1)
fmt.Printf("%T",value2)
fmt.Printf("%T",value3)
}
Ответ 10
вы можете использовать reflect.TypeOf
.
- базовый тип (например:
int
, string
): он вернет свое имя (например: int
, string
)
- struct: он вернет что-то в формате
<package name>.<struct name>
(например: main.test
)
Ответ 11
отражать пакет приходит к спасению:
reflect.TypeOf(obj).String()
Проверьте эту демонстрационную версию
Ответ 12
Вы можете просто использовать метод fmt.Printf() пакета fmt, дополнительную информацию: https://golang.org/pkg/fmt/
Пример: https://play.golang.org/p/aJG5MOxjBJD