কীভাবে কোনও বস্তুর ধরণ খুঁজে পাবেন?


387

আমি কীভাবে কোনও বস্তুর ধরণ খুঁজে পাব? পাইথনে, আমি কেবলমাত্র typeofবস্তুর প্রকারটি আনতে ব্যবহার করি । একইভাবে গো তেও কি একইরকম বাস্তবায়ন করার উপায় আছে?

এখানে যে ধারকটি থেকে আমি পুনরাবৃত্তি করছি তা এখানে:

for e := dlist.Front(); e != nil; e = e.Next() {
    lines := e.Value
    fmt.Printf(reflect.TypeOf(lines))
}

আমি স্ট্রিংগুলির একটি অ্যারে এই ক্ষেত্রে অবজেক্ট লাইনের ধরণটি পেতে সক্ষম নই।


আমার প্রোগ্রামে মানক রেফারেন্স কাজ করছে working আমার সোর্স কোডটি আমার খারাপ হিসাবে অন্তর্ভুক্ত করা উচিত ছিল।
রাহুল

5
fmt.Printf("%T\n", var)
meh

উত্তর:


470

ভেরিয়েবলের ধরণ নিরীক্ষণের জন্য গো প্রতিবিম্ব প্যাকেজটির পদ্ধতি রয়েছে।

নিম্নলিখিত স্নিপেট একটি স্ট্রিং, পূর্ণসংখ্যা এবং ভাসমানের প্রতিবিম্ব প্রকারটি মুদ্রণ করবে।

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))

}

আউটপুট:

Hello, playground
string
int
float64

দেখুন: http://play.golang.org/p/XQMcUVsOja এটিকে ক্রিয়াতে দেখতে ।

এখানে আরও ডকুমেন্টেশন: http://golang.org/pkg/reflect/# টাইপ


আমার জন্য কাজ প্রতিফলিত। আমি প্রশ্ন আপডেট করেছি। আমি এই ক্ষেত্রে কোড স্নিপেট অন্তর্ভুক্ত করেছি।
রাহুল

462

রানটাইমের সময় ভেরিয়েবলের ধরণটি ফেরত দেওয়ার জন্য আমি 3 টি উপায় পেয়েছি:

স্ট্রিং ফর্ম্যাটিং ব্যবহার করে

func typeof(v interface{}) string {
    return fmt.Sprintf("%T", v)
}

প্রতিবিম্ব প্যাকেজ ব্যবহার

func typeof(v interface{}) string {
    return reflect.TypeOf(v).String()
}

প্রকারের assertions ব্যবহার

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
দেখে মনে হচ্ছে আপনি পরিবর্তনশীল থেকে মুক্তি পেতে পারেন t, তাই t := v.(type)হয়ে যায় v.(type)এবং _ = tআর প্রয়োজন হয় না।
আকাওয়াল

3
একটি বেয়ারবোনস বেঞ্চমার্কের উপর ভিত্তি করে, প্রতিফলন পদ্ধতির আশ্চর্যজনকভাবে আরও দক্ষ gist.github.com/mrap/7f08c9549289b6aea2923c27888e7e3e
মাইক রাপাদাস

case 'T': p.fmt.fmtS(reflect.TypeOf(arg).String())। fmt প্যাকেজটি মুদ্রণ প্রকারের প্রতিবিম্ব ব্যবহার করে
ফ্যান্টাসি_আরকিউ

50

প্রতিবিম্ব প্যাকেজ ব্যবহার করুন :

প্যাকেজ প্রতিফলিত প্রয়োগ রান-টাইম প্রতিবিম্ব, একটি প্রোগ্রামকে নির্বিচারে ধরণের সঙ্গে অবজেক্টগুলি ম্যানিপুলেট করার অনুমতি দেয়। সাধারণ ব্যবহারটি হ'ল স্ট্যাটিক টাইপ ইন্টারফেস with with এর সাথে একটি মান নেওয়া এবং টাইপঅফকে কল করে তার গতিশীল প্রকারের তথ্য আহরণ করা, যা কোনও প্রকার ফেরত দেয়।

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

খেলার মাঠ


প্রতিবিম্ব শুধুমাত্র মান প্রকার প্রদর্শন করে। আমি কোনও তালিকার ধারকের ধরণের উপাদান পেতে সক্ষম নই।
রাহুল

আমি আমার উত্তর আপডেট করেছি একটি টুকরো টুকরো অন্তর্ভুক্ত করতে। প্রতিবিম্ব যে কোনও ধরণের জন্য কাজ করে। দয়া করে দস্তাবেজগুলি পড়ুন: golang.org/pkg/reflect & blog.golang.org/laws-of-refલેક્શન যথেষ্ট হওয়া উচিত, যদিও গো-তে প্রতিবিম্ব সম্পর্কিত অনেকগুলি প্রশ্ন রয়েছে যা আপনাকেও সহায়তা করতে পারে।
ইন্টারমারনেট

2
ওহহ, আমি টাইপটি স্ট্রিং কিনা তা কীভাবে নির্ধারণ করতে পারি? if reflect.TypeOf(err) == string?
আলেকজান্ডার মিলস

43

একটি স্ট্রিং প্রতিনিধিত্ব পেতে:

Http://golang.org/pkg/fmt/ থেকে

% T মানের প্রকারের গো-সিনট্যাক্স উপস্থাপনা

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

খুব বাস্তববাদী পদ্ধতির +1
বিজন

16

আমি প্রতিবিম্ব থেকে দূরে থাকব। প্যাকেজ। পরিবর্তে% টি ব্যবহার করুন

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)
 }

13

সেরা উপায় হ'ল গুগলে প্রতিবিম্ব ধারণাটি ব্যবহার করা।
reflect.TypeOfপ্যাকেজের নামের সাথে
reflect.TypeOf().Kind()টাইপ দেয় আন্ডারলাইনিং টাইপ দেয়


1
এটি আমার কাছে মনে হয় এটি আরও উত্তম
Ezio

9

সংক্ষেপে, দয়া fmt.Printf("%T", var1) করে এফএমটি প্যাকেজটিতে বা এর অন্যান্য রূপগুলি ব্যবহার করুন ।


4

রানটাইমের সময় আপনি যে কোনও চলক / উদাহরণের ধরণটি "প্রতিবিম্বিত" প্যাকেজ 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)
}

4

কাঠামোয় ক্ষেত্রের ধরণ পেতে

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

আইডিই https://play.golang.org/p/bwIpYnBQiE এ দেখুন


0

আপনি ব্যবহার করতে পারেন reflect.TypeOf

  • মৌলিক টাইপ (উদাহরণ: int, string): এটা তার নাম ফিরে আসবে (যেমন: int, string)
  • কাঠামো: এটি বিন্যাসে কিছু ফেরত দেবে <package name>.<struct name>(যেমন main.test:)

0

আমাদের যদি এই ভেরিয়েবলগুলি থাকে:

var counter int = 5
var message string  = "Hello"
var factor float32 = 4.2
var enabled bool = false

1: এফএমটি.প্রিন্টফ% টি ফর্ম্যাট: এই বৈশিষ্ট্যটি ব্যবহার করতে আপনার "এফএমটি" আমদানি করা উচিত

fmt.Printf("%T \n",factor )   // factor type: float32

2: প্রতিবিম্ব.আপনার ফাংশন: এই বৈশিষ্ট্যটি ব্যবহার করতে আপনার " প্রতিবিম্বিত " আমদানি করা উচিত

fmt.Println(reflect.TypeOf(enabled)) // enabled type:  bool

3: প্রতিবিম্ব.ভালিউঅফ (এক্স) .প্রকার () : এই বৈশিষ্ট্যটি ব্যবহার করতে আপনার "প্রতিফলন" আমদানি করা উচিত

fmt.Println(reflect.ValueOf(counter).Kind()) // counter type:  int

0

আপনি ব্যবহার করতে পারেন: interface{}..(type)এই খেলার মাঠের মতো

package main
import "fmt"
func main(){
    types := []interface{} {"a",6,6.0,true}
    for _,v := range types{
        fmt.Printf("%T\n",v)
        switch v.(type) {
        case int:
           fmt.Printf("Twice %v is %v\n", v, v.(int) * 2)
        case string:
           fmt.Printf("%q is %v bytes long\n", v, len(v.(string)))
       default:
          fmt.Printf("I don't know about type %T!\n", v)
      }
    }
}


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.