166

Python では、文字列を分割して変数に割り当てることができます。

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

しかし、Goではうまくいかないようです:

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

質問: 1 つのステップで文字列を分割して値を割り当てる方法を教えてください。

4

9 に答える 9

272

たとえば、次の 2 つの手順を実行します。

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>
于 2013-05-14T19:45:39.517 に答える
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
}
于 2013-08-02T13:46:16.447 に答える
9

RemoteAddrfromのようなフィールドの 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>
于 2018-02-25T01:14:39.637 に答える
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)
}

これがstrings.Splitの定義です

// 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) }
于 2018-12-05T08:46:29.777 に答える
1

あなたがしているのは、2 つの異なる変数で分割応答を受け入れていることです。strings.Split() は 1 つの応答のみを返し、それは文字列の配列です。それを単一の変数に格納する必要があり、配列のインデックス値を取得して文字列の一部を抽出できます。

例 :

 var hostAndPort string
    hostAndPort = "127.0.0.1:8080"
    sArray := strings.Split(hostAndPort, ":")
    fmt.Println("host : " + sArray[0])
    fmt.Println("port : " + sArray[1])
于 2019-03-21T09:55:37.650 に答える
1
**In this function you can able to split the function by golang using array of strings**

func SplitCmdArguments(args []string) map[string]string {
    m := make(map[string]string)
    for _, v := range args {
        strs := strings.Split(v, "=")
        if len(strs) == 2 {
            m[strs[0]] = strs[1]
        } else {
            log.Println("not proper arguments", strs)
        }
    }
    return m
}
于 2020-07-26T17:53:33.010 に答える