Как найти тип объекта в 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)