উত্তর:
সম্পাদনা করুন:
১.১০ সাল থেকে স্ট্রিংস.বিল্ডার বিদ্যমান। উদাহরণ:
buf := new(strings.Builder)
n, err := io.Copy(buf, r)
// check errors
fmt.Println(buf.String())
নীচে বাইরে তথ্য
সংক্ষিপ্ত উত্তরটি এটি কার্যকর হবে না কারণ স্ট্রিংয়ে রূপান্তরিত করতে বাইট অ্যারের সম্পূর্ণ অনুলিপি করা দরকার। আপনি যা চান তা করার এখানে সঠিক (অ-দক্ষ) উপায়:
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
s := buf.String() // Does a complete copy of the bytes in the buffer.
এই অনুলিপিটি সুরক্ষা ব্যবস্থা হিসাবে করা হয়। স্ট্রিংগুলি অপরিবর্তনীয়। আপনি যদি একটি [] বাইটকে একটি স্ট্রিতে রূপান্তর করতে পারেন তবে আপনি স্ট্রিংয়ের বিষয়বস্তু পরিবর্তন করতে পারেন। তবে গো আপনাকে অনিরাপদ প্যাকেজ ব্যবহার করে ধরণের সুরক্ষা ব্যবস্থা অক্ষম করতে দেয়। আপনার নিজের ঝুঁকিতে অনিরাপদ প্যাকেজটি ব্যবহার করুন। আশা করি একা নামটিই যথেষ্ট যথেষ্ট সতর্কতা। আমি কীভাবে এটি অনিরাপদ ব্যবহার করে করব:
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
আমরা সেখানে যাই, আপনি এখন দক্ষতার সাথে আপনার বাইট অ্যারে স্ট্রিংয়ে রূপান্তর করেছেন। সত্যিই, এই সমস্ত কাজটি টাইপ সিস্টেমটিকে স্ট্রিং হিসাবে কল্পনা করে। এই পদ্ধতিতে কয়েকটি দম্পতি রয়েছে:
আমার পরামর্শটি সরকারী পদ্ধতিতে লেগে থাকা। অনুলিপি করা এত ব্যয়বহুল নয় এবং এটি অনিরাপদগুলির কুফলের জন্য মূল্যবান নয়। যদি স্ট্রিংটি অনুলিপি করার জন্য খুব বড় হয় তবে আপনার এটি স্ট্রিং হিসাবে তৈরি করা উচিত নয়।
strings.Builder
অন্তর্নিহিত []byte
কখনই ফাঁস হয় না তা নিশ্চিত করে এবং string
এইভাবে কোনও কপি ছাড়াই এমনভাবে রূপান্তর করে যাতে এগিয়ে যাওয়া সমর্থনযোগ্য। এটি ২০১২ সালে উপস্থিত ছিল না @ একটি সম্পাদনা বিবেচনা করুন!
উত্তরগুলি এখনও পর্যন্ত প্রশ্নের পুরো অংশটিকে "সম্বোধন" করতে পারেনি। আমি মনে করি এটি করার ভাল উপায় ioutil.ReadAll
। আপনার io.ReaderCloser
নাম দিয়ে rc
আমি লিখব,
if b, err := ioutil.ReadAll(rc); err == nil {
return string(b)
} ...
buf.ReadFrom()
ইওএফ পর্যন্ত পুরো স্ট্রিমটি পড়েছে।
ioutil.ReadAll()
এবং এটি কেবল একটি bytes.Buffer
'র' জড়িয়ে দেয় ReadFrom
। এবং বাফারের String()
পদ্ধতিটি কাস্টিংয়ের চারপাশে একটি সহজ মোড়ক string
- সুতরাং দুটি পদ্ধতির ব্যবহারিকভাবে একই রকম!
data, _ := ioutil.ReadAll(response.Body)
fmt.Println(string(data))
সবচেয়ে কার্যকর উপায় হ'ল []byte
পরিবর্তে সর্বদা ব্যবহার করা string
।
আপনার কাছ থেকে প্রাপ্ত ডেটা মুদ্রণের প্রয়োজন io.ReadCloser
হলে fmt
প্যাকেজটি পরিচালনা করতে পারে []byte
তবে এটি কার্যকর নয় কারণ fmt
প্রয়োগটি অভ্যন্তরীণভাবে রূপান্তরিত []byte
হবে string
। এই রূপান্তরটি এড়ানোর জন্য, আপনি fmt.Formatter
কোনও ধরণের জন্য ইন্টারফেসটি প্রয়োগ করতে পারেন type ByteSlice []byte
।
[]byte
করতে string
যুক্তিসঙ্গতভাবে দ্রুত, কিন্তু প্রশ্ন "সবচেয়ে কার্যকর উপায়" সম্পর্কে জিজ্ঞাসা ছিল। বর্তমানে, গো রান-টাইম string
রূপান্তরিত []byte
হওয়ার সময় সর্বদা একটি নতুন বরাদ্দ করবে string
। এর কারণ হ'ল সংকলক []byte
রূপান্তরতার পরে কীভাবে পরিবর্তন করা হবে তা নির্ধারণ করতে জানে না । সংকলক অপ্টিমাইজেশনের জন্য এখানে কিছু জায়গা রয়েছে।
func copyToString(r io.Reader) (res string, err error) {
var sb strings.Builder
if _, err = io.Copy(&sb, r); err == nil {
res = sb.String()
}
return
}
var b bytes.Buffer
b.ReadFrom(r)
// b.String()
আমি বাইটস.বাফার স্ট্রাক্ট পছন্দ করি । আমি দেখতে পাচ্ছি এটিতে ReadFrom এবং স্ট্রিং পদ্ধতি রয়েছে। আমি এটি একটি [] বাইট দিয়ে ব্যবহার করেছি তবে আইও.আরডিডার নয়।