ডেটা (টাইপ ইন্টারফেস {}) কে স্ট্রিং টাইপ করতে রূপান্তর করতে পারে না: টাইপ সংক্ষেপণ প্রয়োজন


178

আমি যেতে বেশ নতুন এবং আমি এই বিজ্ঞপ্তি প্যাকেজটি নিয়ে খেলছিলাম ।

প্রথমে আমার কাছে কোডটি ছিল যা দেখতে দেখতে এই রকম ছিল:

func doit(w http.ResponseWriter, r *http.Request) {
    notify.Post("my_event", "Hello World!")
    fmt.Fprint(w, "+OK")
}

আমি নিউলাইনটি সংযুক্ত করতে চেয়েছিলাম Hello World!কিন্তু doitউপরের ফাংশনে নয় , কারণ এটি বেশ তুচ্ছ হবে, তবে পরবর্তী সময়ে handlerনীচের মত:

func handler(w http.ResponseWriter, r *http.Request) {
    myEventChan := make(chan interface{})
    notify.Start("my_event", myEventChan)
    data := <-myEventChan
    fmt.Fprint(w, data + "\n")
}

পরে go run:

$ go run lp.go 
# command-line-arguments
./lp.go:15: invalid operation: data + "\n" (mismatched types interface {} and string)

কিছুক্ষণ গুগল করার পরে আমি এই প্রশ্নটি এসওতে পেয়েছি ।

তারপরে আমি আমার কোডটি এতে আপডেট করেছি:

func handler(w http.ResponseWriter, r *http.Request) {
    myEventChan := make(chan interface{})
    notify.Start("my_event", myEventChan)
    data := <-myEventChan
    s:= data.(string) + "\n"
    fmt.Fprint(w, s)
}

এটা কি আমার করার কথা ছিল? আমার সংকলক ত্রুটিগুলি চলে গেছে তাই আমি অনুমান করি যে এটি বেশ ভাল? এটা কি দক্ষ? আপনি এটা অন্যভাবে করা উচিত?

উত্তর:


292

মতে যান স্পেসিফিকেশন :

ইন্টারফেস প্রকারের এক্স এক্সপ্রেশন এবং টাইপ টি-এর জন্য, প্রাথমিক এক্সপ্রেশন x। (টি) দৃser়ভাবে জানিয়ে দেয় যে x শূন্য নয় এবং x এর মধ্যে সঞ্চিত মান টি টাইপের হয় that

একটি "প্রকারের দৃtion়তা" আপনাকে একটি ইন্টারফেস মানটি নির্দিষ্ট কংক্রিটের ধরণের বা এটির কংক্রিটের প্রকারটি অন্য কোনও ইন্টারফেসকে সন্তুষ্ট করার ঘোষণা দেয়।

আপনার উদাহরণে, আপনি ডেটা জোর দিয়েছিলেন (টাইপ ইন্টারফেস {}) এর কংক্রিট টাইপ স্ট্রিং রয়েছে। আপনি যদি ভুল হয়ে থাকেন তবে প্রোগ্রামটি রানটাইমে আতঙ্কিত হবে। দক্ষতার বিষয়ে আপনাকে চিন্তা করার দরকার নেই, চেক করার জন্য কেবল দুটি পয়েন্টার মানের তুলনা করা দরকার।

যদি আপনি অনিশ্চিত হন যে এটি স্ট্রিংটি ছিল কি না তবে আপনি দুটি রিটার্ন সিনট্যাক্স ব্যবহার করে পরীক্ষা করতে পারেন।

str, ok := data.(string)

যদি ডেটা স্ট্রিং না হয় তবে ঠিক আছে false এরপরে যদি এই জাতীয় বিবৃতিটি আইফোনের বিবৃতিতে এমনভাবে আবৃত করা সাধারণ হয়:

if str, ok := data.(string); ok {
    /* act on str */
} else {
    /* not string */
}

29

সংক্ষেপে টাইপ করুন

এটি type assertionগোলং হিসাবে পরিচিত , এবং এটি একটি সাধারণ অনুশীলন।

এখানে একটি সফর থেকে ব্যাখ্যা :

একটি ধরণের দৃser়তা একটি ইন্টারফেস মানের অন্তর্নিহিত কংক্রিট মানের অ্যাক্সেস সরবরাহ করে।

t := i.(T)

এই বিবৃতিটি দৃser়ভাবে জানায় যে ইন্টারফেস মান i কংক্রিট টাইপ টি ধারণ করে এবং ভেরিয়েবল টিতে অন্তর্নিহিত টি মান নির্ধারণ করে।

যদি আমি টি টি না ধরে, বিবৃতিটি আতঙ্ককে ট্রিগার করবে।

কোনও ইন্টারফেস মান একটি নির্দিষ্ট ধরণের ধারণ করে কিনা তা পরীক্ষা করতে, একটি টাইপ জোর দেওয়া দুটি মান প্রদান করতে পারে: অন্তর্নিহিত মান এবং একটি বুলিয়ান মান যা প্রতিবেদনটি সফল হয়েছে কিনা তা রিপোর্ট করে।

t, ok := i.(T)

যদি আমি একটি টি ধরে রাখি তবে টিটি অন্তর্নিহিত মান হবে এবং ঠিক আছে।

যদি তা না হয় তবে ঠিক আছে মিথ্যা এবং টি টাইপ টির শূন্য মান হবে এবং কোনও আতঙ্ক দেখা দেয় না।

দ্রষ্টব্য: মান iইন্টারফেস প্রকারের হওয়া উচিত

pitfalls

এমনকি যদি iএকটি ইন্টারফেস টাইপ হয়, []iইন্টারফেস টাইপ নয়। ফলস্বরূপ, []iএর মান ধরণের রূপান্তর করতে, আমাদের স্বতন্ত্রভাবে এটি করতে হবে:

// var items []i
for _, item := range items {
    value, ok := item.(T)
    dosomethingWith(value)
}

কর্মক্ষমতা

পারফরম্যান্সের ক্ষেত্রে, এই স্ট্যাকওভারফ্লো উত্তরে শো হিসাবে এটি আসল মানের সরাসরি অ্যাক্সেসের চেয়ে ধীর হতে পারে ।


13
//an easy way:
str := fmt.Sprint(data)

21
এই উত্তরটি কীভাবে বর্তমান সমস্যা সমাধানে
ওপিকে

3

@ For দ্বারা অনুরোধ করা হিসাবে একটি ব্যাখ্যা https://golang.org/pkg/fmt/#Sprint এ পাওয়া যাবে । সংশ্লিষ্ট ব্যাখ্যা পাওয়া যাবে https://stackoverflow.com/a/44027953/12817546 এবং https://stackoverflow.com/a/42302709/12817546 । এখানে @ ইউয়ানবো এর উত্তর সম্পূর্ণ।

package main

import "fmt"

func main() {
    var data interface{} = 2
    str := fmt.Sprint(data)
    fmt.Println(str)
}

1
আমি আপনি কেবল সম্পাদনা @ Yuanbo এর দ্বারা উভয় উত্তর মেশা যায়নি - আপনি উভয় জমা করা হবে এবং আপনার নিজ নিজ 'উপযোগিতা' স্কোর 😉 পর্যন্ত যোগ
Gwyneth Llewelyn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.