Как определить тип объекта в Go?
Как узнать тип объекта в Go? В Python я просто использую typeof
, чтобы получить тип объекта. Существует ли аналогичный способ сделать это в Go?
Вот код, из которого я итерируюсь:
for e := dlist.Front(); e != nil; e = e.Next() {
lines := e.Value
fmt.Printf(reflect.TypeOf(lines))
}
В этом случае я не могу получить тип объекта lines
, который является массивом строк.
5 ответ(ов)
В пакете рефлексии Go есть методы для инспекции типов переменных.
Ниже приведённый фрагмент кода напечатает рефлексированные типы для строки, целого числа и числа с плавающей запятой.
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))
}
Вывод будет следующим:
string
int
float64
Вы можете посмотреть этот код в действии по ссылке: http://play.golang.org/p/XQMcUVsOja.
Дополнительная документация доступна здесь: http://golang.org/pkg/reflect/#Type.
Чтобы получить строковое представление типа переменной в Go, можно воспользоваться функцией fmt.Printf
с форматом %T
. Этот формат выводит представление типа значения в синтаксисе Go.
Вот простой пример:
package main
import "fmt"
func main() {
types := []interface{}{"a", 6, 6.0, true}
for _, v := range types {
fmt.Printf("%T\n", v)
}
}
Этот код создаёт срез types
, который содержит значения различных типов, и затем выводит тип каждого значения. Результат выполнения программы будет следующим:
string
int
float64
bool
Таким образом, с помощью %T
вы можете легко узнать тип любой переменной в Go.
Я бы посоветовал избегать использования пакета reflect
. Вместо этого используйте %T
в функции fmt.Printf
для получения типа переменной.
Вот пример, как это сделать:
package main
import (
"fmt"
)
func main() {
b := true
s := ""
n := 1
f := 1.0
a := []string{"foo", "bar", "baz"}
fmt.Printf("%T\n", b) // выводит: bool
fmt.Printf("%T\n", s) // выводит: string
fmt.Printf("%T\n", n) // выводит: int
fmt.Printf("%T\n", f) // выводит: float64
fmt.Printf("%T\n", a) // выводит: []string
}
В этом примере используются различные типы данных, и с помощью %T
мы получаем их тип на выходе. Это простой и эффективный способ определить тип переменной, не прибегая к более сложным методам с использованием пакета reflect
.
Лучший способ - использовать концепцию рефлексии в Go.
Метод reflect.TypeOf
возвращает тип вместе с именем пакета.
Метод reflect.TypeOf().Kind()
возвращает основной тип.
Коротко говоря, используйте fmt.Printf("%T", var1)
или другие варианты из пакета fmt.
Существует ли цикл foreach в Go?
Как сопоставить любой символ на нескольких строках в регулярном выражении?
Отформатировать строку в Go без вывода?
Есть ли способ получить доступ к приватным полям структуры из другого пакета?
Получение тега поля структуры с использованием пакета reflect в Go