আমি কীভাবে GoLang এ স্ট্রিং তুলনা করব?


93

গো স্ট্রিং তুলনার ক্ষেত্রে আমি 'সত্য' ফলাফল দিতে অক্ষম। সমস্যাটি ব্যাখ্যা করতে আমি নিম্নলিখিতটি লিখেছি এবং আউটপুটটির একটি স্ক্রিনশট সংযুক্ত করেছি

// string comparison in Go
package main
import "fmt"
import "bufio"
import "os"

func main() {
    var isLetterA bool 

    fmt.Println("Enter the letter a")
    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')

    if(input == "a") {
        isLetterA = true
    } else {
        isLetterA = false 
    }

    fmt.Println("You entered",input)
    fmt.Println("Is it the letter a?",isLetterA)

}

উদাহরণ


উইন্ডোজ ব্যবহারকারীরা আমার উত্তরটি পরীক্ষা করেন :)
দক্ষিণ মিগলানি

উত্তর:


132

==Go এ স্ট্রিংগুলির তুলনা করার জন্য সঠিক অপারেটর। তবে, আপনি STDIN এর সাথে যে স্ট্রিংগুলি পড়েছেন সেগুলি reader.ReadStringধারণ করে না "a"তবে "a\n"(যদি আপনি ঘনিষ্ঠভাবে দেখেন, তবে আপনার উদাহরণের আউটপুটে অতিরিক্ত লাইন বিরতি দেখতে পাবেন)।

আপনি strings.TrimRightআপনার ইনপুট থেকে পেছনের সাদা স্থানগুলি সরিয়ে ফাংশনটি ব্যবহার করতে পারেন :

if strings.TrimRight(input, "\n") == "a" {
    // ...
}

9

প্ল্যাটফর্ম ইন্ডিপেন্ডেন্ট ব্যবহারকারী বা উইন্ডোজ ব্যবহারকারীদের জন্য আপনি যা করতে পারেন তা হ'ল:

আমদানি রানটাইম:

import (
    "runtime"
    "strings"
)

এবং তারপরে স্ট্রিংটি ট্রিম করুন:

if runtime.GOOS == "windows" {
  input = strings.TrimRight(input, "\r\n")
} else {
  input = strings.TrimRight(input, "\n")
}

এখন আপনি এটির মতো তুলনা করতে পারেন:

if strings.Compare(input, "a") == 0 {
  //....yourCode
}

আপনি একাধিক প্ল্যাটফর্মে STDIN ব্যবহার করার সময় এটি আরও ভাল পদ্ধতির।

ব্যাখ্যা

এটি ঘটায় কারণ উইন্ডোজ লাইনে শেষ হয় "\r\n"যার সাথে সিআরএলএফ নামে পরিচিত, তবে ইউএনআইএক্স লাইনগুলির সাথে শেষ হয় "\n"যা এলএফ হিসাবে পরিচিত এবং এজন্য উইন্ডোতে "\n"ছাঁটাই "\r\n"করার সময় আমরা ইউনিক্স ভিত্তিক অপারেটিং সিস্টেমগুলিতে ছাঁটাই করি ।


4
পার্থক্য করার দরকার নেই। দ্বিতীয় যুক্তি একটি কাটসেট, প্রত্যয় নয়, এবং কোনও ক্রম / সংমিশ্রণে কাটসেটের কোনও অক্ষর ছাঁটাই করা হবে। "\ R \ n" কে ট্রিমিং করা উভয়ের পক্ষে যথেষ্ট।
জেসন কার্লসন

1

ধরে নিই যে কোনও প্রিপেন্ডিং / উত্তরোত্তর শ্বেতস্পেসের অক্ষর নেই, স্ট্রিংয়ের সাম্যতা আরোপ করার কয়েকটি উপায় এখনও রয়েছে। এর মধ্যে কয়েকটি হ'ল:

এখানে কিছু বেসিক বেনমার্ক ফলাফল রয়েছে (এই পরীক্ষাগুলিতে, strings.EqualFold(.., ..)সর্বাধিক পারফরম্যান্ট পছন্দ বলে মনে হচ্ছে):

goos: darwin
goarch: amd64
BenchmarkStringOps/both_strings_equal::equality_op-4               10000        182944 ns/op
BenchmarkStringOps/both_strings_equal::strings_equal_fold-4        10000        114371 ns/op
BenchmarkStringOps/both_strings_equal::fold_caser-4                10000       2599013 ns/op
BenchmarkStringOps/both_strings_equal::lower_caser-4               10000       3592486 ns/op

BenchmarkStringOps/one_string_in_caps::equality_op-4               10000        417780 ns/op
BenchmarkStringOps/one_string_in_caps::strings_equal_fold-4        10000        153509 ns/op
BenchmarkStringOps/one_string_in_caps::fold_caser-4                10000       3039782 ns/op
BenchmarkStringOps/one_string_in_caps::lower_caser-4               10000       3861189 ns/op

BenchmarkStringOps/weird_casing_situation::equality_op-4           10000        619104 ns/op
BenchmarkStringOps/weird_casing_situation::strings_equal_fold-4    10000        148489 ns/op
BenchmarkStringOps/weird_casing_situation::fold_caser-4            10000       3603943 ns/op
BenchmarkStringOps/weird_casing_situation::lower_caser-4           10000       3637832 ns/op

যেহেতু বেশ কয়েকটি বিকল্প রয়েছে, সুতরাং বেঞ্চমার্কগুলি তৈরি করার কোডটি এখানে।

package main

import (
    "fmt"
    "strings"
    "testing"

    "golang.org/x/text/cases"
    "golang.org/x/text/language"
)

func BenchmarkStringOps(b *testing.B) {
    foldCaser := cases.Fold()
    lowerCaser := cases.Lower(language.English)

    tests := []struct{
        description string
        first, second string
    }{
        {
            description: "both strings equal",
            first: "aaaa",
            second: "aaaa",
        },
        {
            description: "one string in caps",
            first: "aaaa",
            second: "AAAA",
        },
        {
            description: "weird casing situation",
            first: "aAaA",
            second: "AaAa",
        },
    }

    for _, tt := range tests {
        b.Run(fmt.Sprintf("%s::equality op", tt.description), func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                benchmarkStringEqualsOperation(tt.first, tt.second, b)
            }
        })

        b.Run(fmt.Sprintf("%s::strings equal fold", tt.description), func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                benchmarkStringsEqualFold(tt.first, tt.second, b)
            }
        })

        b.Run(fmt.Sprintf("%s::fold caser", tt.description), func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                benchmarkStringsFoldCaser(tt.first, tt.second, foldCaser, b)
            }
        })

        b.Run(fmt.Sprintf("%s::lower caser", tt.description), func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                benchmarkStringsLowerCaser(tt.first, tt.second, lowerCaser, b)
            }
        })
    }
}

func benchmarkStringEqualsOperation(first, second string, b *testing.B) {
    for n := 0; n < b.N; n++ {
        _ = strings.ToLower(first) == strings.ToLower(second)
    }
}

func benchmarkStringsEqualFold(first, second string, b *testing.B) {
    for n := 0; n < b.N; n++ {
        _ = strings.EqualFold(first, second)
    }
}

func benchmarkStringsFoldCaser(first, second string, caser cases.Caser, b *testing.B) {
    for n := 0; n < b.N; n++ {
        _ = caser.String(first) == caser.String(second)
    }
}

func benchmarkStringsLowerCaser(first, second string, caser cases.Caser, b *testing.B) {
    for n := 0; n < b.N; n++ {
        _ = caser.String(first) == caser.String(second)
    }
}

0

গোলংয়ের স্ট্রিংয়ের অভ্যন্তরের সামগ্রীটি ==অপারেটর ব্যবহার করে তুলনা করা যেতে পারে । ফলাফল হিসাবে প্রত্যাশিত না হলে সেখানে মত কিছু গোপন অক্ষর হতে পারে \n, \r, স্পেস, ইত্যাদি সুতরাং একটি চলতি সাধারণ নিয়ম অনুযায়ী, দ্বারা উপলব্ধ ফাংশন ব্যবহার করে ঐ সরানোর চেষ্টা করুন stringsgolang মধ্যে প্যাকেজ।

দৃষ্টান্তের জন্য, strings.TrimSpaceফাংশন ব্যবহার করে স্পেসগুলি সরানো যেতে পারে । আপনার প্রয়োজনীয় কোনও অক্ষর অপসারণ করতে আপনি একটি কাস্টম ফাংশনও সংজ্ঞায়িত করতে পারেন। strings.TrimFuncফাংশন আপনাকে আরও শক্তি দিতে পারে।

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