গোতে সাবস্ট্রিংগুলি উত্তোলন করা হচ্ছে


114

আমি কনসোল (হোয়াইটস্পেস সহ) থেকে একটি সম্পূর্ণ লাইন পড়ার চেষ্টা করছি, তারপরে এটি প্রক্রিয়া করুন। বুফিও.আড স্ট্রিং ব্যবহার করে, নিউলাইন চরিত্রটি ইনপুটটির সাথে একসাথে পড়া হয়, তাই আমি নতুন লাইন চরিত্রটি ছাঁটাইতে নিম্নলিখিত কোডটি নিয়ে এসেছি:

input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string

এটি করার মতো আরও কোনও মুশকিল উপায় আছে? অর্থাৎ, ইতিমধ্যে এমন কোনও গ্রন্থাগার রয়েছে যা আপনার জন্য সাবস্ট্রিংগুলি বের করার সময় শেষ নাল বাইটের যত্ন নেয়?

(হ্যাঁ, আমি জানি যে গো রেডলাইন -> স্ট্রিংয়ে নতুন লাইন চরিত্র ছাড়া লাইনটি পড়ার একটি উপায় রয়েছে তবে আমি মার্জিত স্ট্রিং ম্যানিপুলেশনের জন্য আরও সন্ধান করছি।)

উত্তর:


146

দেখে মনে হচ্ছে আপনি স্লাইসগুলির কাজ করে এবং স্ট্রিং স্টোরেজ ফর্ম্যাট দ্বারা বিভ্রান্ত হয়ে পড়েছেন যা আপনি সিতে থাকা থেকে আলাদা which

  • গো-এর যে কোনও স্লাইস দৈর্ঘ্য (বাইটে) সঞ্চয় করে, তাই আপনাকে lenঅপারেশনটির ব্যয় সম্পর্কে যত্ন নিতে হবে না : গণনা করার দরকার নেই
  • গো স্ট্রিংগুলি বাতিল হয় না, সুতরাং আপনাকে কোনও নাল বাইট সরিয়ে ফেলতে হবে না এবং 1খালি স্ট্রিং যুক্ত করে টুকরো টুকরো করার পরে আপনাকে যুক্ত করতে হবে না ।

শেষ চরটি মুছে ফেলতে (এটি যদি একটি বাইট চর হয়), কেবল করুন

inputFmt:=input[:len(input)-1]

11
এমনকি আপনার 0 (বা :) এরও দরকার নেই, এটি s = s[:len(s)-1]করবে।
uriel

1
স্পষ্ট করার জন্য অনেক ধন্যবাদ; মনে হচ্ছে রিড স্ট্রিং ফাংশন থেকে ফিরে আসা স্ট্রিংয়ের শেষে দুটি সাদা অংশের অক্ষর ছিল, তাই আমি একটি নাল বাইটের জন্য ভুল করেছিলাম। সি স্ট্রিংগুলির সাথে বিভ্রান্তির জন্য দুঃখিত; আমি বুফিওর সাথে একসাথে এফএমটি ব্যবহার করছিলাম ফলস্বরূপ মজাদার জিনিসগুলি কনসোলে উপস্থিত হয়েছিল, তাই আমি ভেবেছিলাম এটি নোংরা নাল বাইট হতে পারে। কেবল একটি চূড়ান্ত স্পষ্টতা - রিড স্ট্রিংয়ের অতিরিক্ত শ্বেত স্থানটি কী হতে পারে?
2222

ঠিক আছে আমি আমার নিজের প্রশ্নের উত্তর দেব - এটি \ r তাহলে \ n: P মজার কনসোল আউটপুটটি কারণ আমি I r ছাড়াই output r আউটপুট করেছি।
2222

8
দয়া করে নোট করুন যে এই পদ্ধতিটি ইউনিকোড স্ট্রিংগুলির সাথে কাজ করবে না! groups.google.com/forum/#!msg/golang-nuts/ZeYei0IWrLg/…
মেল্ল্বর

@ মেল্লওয়ার এই কারণেই আমি "যদি এটি একটি বাইট চর হয় তবে" সংশোধন করেছি । আপনি যদি একাধিক বাইট গ্রহণের চরটি অপসারণ করতে চান (এটি ওপির ক্ষেত্রে নয়), আপনাকে মানিয়ে নিতে হবে।
অস্বীকার করেন সাগুরেট

25

গো স্ট্রিংগুলি বাতিল হয় না, এবং স্ট্রিংয়ের শেষ চরটি সরাতে আপনি যা করতে পারেন তা করতে পারেন:

s = s[:len(s)-1]

10
এটি ভুল এবং ত্রুটিগুলি সৃষ্টি করবে। এটি স্ট্রিংয়ের শেষ বাইটটি সরিয়ে দেয়, এটি এটিকে অবৈধ ইউটিএফ -8 (বা অন্যান্য মাল্টবাইট এনকোডিং) সরবরাহ করতে পারে।
ড। সাইবারেন

3
এটি কীভাবে ভেঙে যায় তার উদাহরণের জন্য play.golang.org/p/K3HBBtj4Oi দেখুন ।
ড। সাইবারেন

10

শূন্য দৈর্ঘ্যের ইনপুটটিতে আতঙ্ক এড়াতে, যদি একটিতে কাটা কাটা কাজটি लपेटান

input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
    inputFmt = input[:len(input)-1]
}
// Do something with inputFmt

9

Go এ সাবস্ট্রিং সম্পাদন করা সহজ

package main

import "fmt"

var p = fmt.Println

func main() {

  value := "address;bar"

  // Take substring from index 2 to length of string
  substring := value[2:len(value)]
  p(substring)

}

7

সতর্কতা: কেবল স্ট্রিংগুলিতে অপারেশন করা কেবলমাত্র ASCII এর সাথে কাজ করবে এবং ভুল হিসাবে গণ্য হবে যখন ইনপুটটি একটি অ-ASCII UTF-8 এনকোডেড অক্ষর হবে এবং এটি এমনকি মাল্টিবাইট চরগুলি মাঝের সিকোয়েন্সটি কেটে দেবে বলে এটি এমনকি দুর্নীতিগ্রস্থ অক্ষরগুলিও ফেলবে।

এখানে একটি ইউটিএফ -8-সচেতন সংস্করণ:

func substr(input string, start int, length int) string {
    asRunes := []rune(input)

    if start >= len(asRunes) {
        return ""
    }

    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }

    return string(asRunes[start : start+length])
}

1
এর আরও বেশি উপায়ে নেওয়া দরকার - utf-8 সচেতন বিভাজন ব্যবহার না করেই আমি খারাপভাবে কামড়েছি।
7:44


2

8 বছর পরে আমি এই রত্নকে হোঁচট খেয়েছি এবং তবুও আমি বিশ্বাস করি না যে ওপির মূল প্রশ্নের উত্তরটি সত্যিই দেওয়া হয়েছিল:

সুতরাং আমি নতুন কোডলাইন চরিত্রটি ছাঁটাতে নিম্নলিখিত কোডটি নিয়ে এসেছি

যদিও bufio.Readerধরনের একটি সমর্থন ReadLine() পদ্ধতি যা উভয় অপসারণ \r\nএবং \nএটা একটি নিম্ন স্তরের ফাংশন যা ব্যবহারের বিশ্রী কারণ পুনরাবৃত্তি চেক প্রয়োজনীয় হিসাবে বোঝানো হয়।

গোলাপের স্ট্রিং লাইব্রেরিটি হ'ল স্পেস সরানোর আইডেমোমেটিক উপায় হ'ল আইএমও :

input, _ = src.ReadString('\n')

// more specific to the problem of trailing newlines
actual = strings.TrimRight(input, "\r\n")

// or if you don't mind to trim leading and trailing whitespaces 
actual := strings.TrimSpace(input)

গোলং খেলার মাঠের ক্রিয়াতে এই উদাহরণটি দেখুন: https://play.golang.org/p/HROWH0kl3Ww

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