স্ট্রিংকে কীভাবে বিভক্ত করবেন এবং ভেরিয়েবলগুলিতে এটি নির্ধারণ করুন


151

পাইথনে এটি একটি স্ট্রিংকে বিভক্ত করে ভেরিয়েবলগুলিতে নির্ধারণ করা সম্ভব:

ip, port = '127.0.0.1:5432'.split(':')

তবে গোতে এটি কাজ করে বলে মনে হচ্ছে না:

ip, port := strings.Split("127.0.0.1:5432", ":")
// assignment count mismatch: 2 = 1

প্রশ্ন: একটি স্ট্রিংকে কীভাবে বিভক্ত করবেন এবং এক ধাপে মান নির্ধারণ করবেন?


2
splittedString: = strings.Split("127.0.0.1:5432", ":")উত্তর: = splittedString[index]আপনি বিভক্ত স্ট্রিংয়ের মান অ্যাক্সেস করতে পারবেন
মুথুকুমার সেলভরাজ

উত্তর:


249

দুটি পদক্ষেপ, উদাহরণস্বরূপ,

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := strings.Split("127.0.0.1:5432", ":")
    ip, port := s[0], s[1]
    fmt.Println(ip, port)
}

আউটপুট:

127.0.0.1 5432

একটি পদক্ষেপ, উদাহরণস্বরূপ,

package main

import (
    "fmt"
    "net"
)

func main() {
    host, port, err := net.SplitHostPort("127.0.0.1:5432")
    fmt.Println(host, port, err)
}

আউটপুট:

127.0.0.1 5432 <nil>

এটি একটি স্ট্রিংকে স্ট্রিংগুলির তালিকায় বিভক্ত করে, অক্ষরের তালিকায় নয়।
দোপাট্রামন

4
আমরা যদি একটি আইপিভি 6 ঠিকানা পাই তবে কী হবে?
পাম্পকিনসিড

@ পাম্পকিনসিদ কেবল এটি ব্যবহার করে দেখেছি এবং errদুর্ভাগ্যক্রমে: আমি এটিকে ফিরে পেয়েছি too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
জেএম জানজেন

21

যেহেতু goনমনীয় একটি আপনি নিজের pythonস্টাইল বিভাজন তৈরি করতে পারেন ...

package main

import (
    "fmt"
    "strings"
    "errors"
)

type PyString string

func main() {
    var py PyString
    py = "127.0.0.1:5432"
    ip, port , err := py.Split(":")       // Python Style
    fmt.Println(ip, port, err)
}

func (py PyString) Split(str string) ( string, string , error ) {
    s := strings.Split(string(py), str)
    if len(s) < 2 {
        return "" , "", errors.New("Minimum match not found")
    }
    return s[0] , s[1] , nil
}

1
এটি পাইথন সমতুল্য থেকে কিছুটা আলাদা। আপনি কীভাবে একটি পরিবর্তনশীল-রিটার্ন-গণনা সংস্করণ তৈরি করবেন?
গ্রাওক্স 2

15
আমি যেতে চাই তবে আমি এটিকে নমনীয় বলব না : ডি
পাইজুসন

7

RemoteAddrথেকে ক্ষেত্রগুলির জন্য IPv6 ঠিকানাগুলি http.Request"[:: 1]: 53343" হিসাবে ফর্ম্যাট করা হয়েছে

সুতরাং net.SplitHostPortদুর্দান্ত কাজ করে:

package main

    import (
        "fmt"
        "net"
    )

    func main() {
        host1, port, err := net.SplitHostPort("127.0.0.1:5432")
        fmt.Println(host1, port, err)

        host2, port, err := net.SplitHostPort("[::1]:2345")
        fmt.Println(host2, port, err)

        host3, port, err := net.SplitHostPort("localhost:1234")
        fmt.Println(host3, port, err)
    }

আউটপুট হল:

127.0.0.1 5432 <nil>
::1 2345 <nil>
localhost 1234 <nil>

2
package main

import (
    "fmt"
    "strings"
)

func main() {
    strs := strings.Split("127.0.0.1:5432", ":")
    ip := strs[0]
    port := strs[1]
    fmt.Println(ip, port)
}

এখানে স্ট্রিংগুলির জন্য সংজ্ঞা দেওয়া হয়েছে p

// Split slices s into all substrings separated by sep and returns a slice of
// the substrings between those separators.
//
// If s does not contain sep and sep is not empty, Split returns a
// slice of length 1 whose only element is s.
//
// If sep is empty, Split splits after each UTF-8 sequence. If both s
// and sep are empty, Split returns an empty slice.
//
// It is equivalent to SplitN with a count of -1.
func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }

এখানে একটি ত্রুটি "Str: undefined ./prog.go:12:17" হয়
Anshu

1

স্ট্রিংকে বিভক্ত করার একাধিক উপায় রয়েছে:

  1. আপনি যদি এটি অস্থায়ী করতে চান তবে এইভাবে ভাগ করুন:

: _

import net package

host, port, err := net.SplitHostPort("0.0.0.1:8080")
if err != nil {
fmt.Println("Error is splitting : "+err.error());
//do you code here
}
fmt.Println(host, port)
  1. কাঠামোর ভিত্তিতে বিভক্ত:

    • এর মতো একটি স্ট্রাক্ট তৈরি করুন এবং বিভক্ত করুন

: _

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

ServerDetail = net.SplitHostPort("0.0.0.1:8080") //Specific for Host and Port

Now মত আপনি কোড ব্যবহার ServerDetail.HostএবংServerDetail.Port

আপনি যদি নির্দিষ্ট স্ট্রিংকে বিভক্ত করতে না চান তবে এটি করুন:

type ServerDetail struct {
    Host       string
    Port       string
}

ServerDetail = strings.Split([Your_String], ":") // Common split method

মত ব্যবহার ServerDetail.Hostএবং ServerDetail.Port

এখানেই শেষ.


কাঠামোর ফর্মটি কাজ করে না:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
ই অ্যান্ডারসন

1

আপনি যা করছেন তা হ'ল, আপনি দুটি পৃথক ভেরিয়েবলে বিভক্ত প্রতিক্রিয়া গ্রহণ করছেন, এবং স্ট্রিংস p আপনাকে এটি একক ভেরিয়েবলে সঞ্চয় করতে হবে এবং তারপরে আপনি কোনও অ্যারের সূচক মান আনতে স্ট্রিংয়ের অংশটি বের করতে পারেন।

উদাহরণ:

 var hostAndPort string
    hostAndPort = "127.0.0.1:8080"
    sArray := strings.Split(hostAndPort, ":")
    fmt.Println("host : " + sArray[0])
    fmt.Println("port : " + sArray[1])

1

পার্শ্ব নোট হিসাবে, Go এ স্ট্রিং বিভক্ত করার সময় আপনি বিভাজকগুলি অন্তর্ভুক্ত করতে পারেন। এটি করতে strings.SplitAfterনীচের উদাহরণ হিসাবে ব্যবহার করুন ।

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Printf("%q\n", strings.SplitAfter("z,o,r,r,o", ","))
}

0

গোলং কোনও স্লাইসের অন্তর্নিহিত আনপ্যাকিং সমর্থন করে না (পাইথনের বিপরীতে) এবং এই কারণেই এটি কাজ করবে না। উপরে বর্ণিত উদাহরণগুলির মতো, আমাদের এটির পুনরায় কাজ করা দরকার।

এক পক্ষের নোট:

অন্তর্ভুক্ত আনপ্যাকিংটি চলতে চলতে বৈচিত্রপূর্ণ ফাংশনগুলির জন্য ঘটে:

func varParamFunc(params ...int) {

}

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