文字列を分割して変数に割り当てる方法


151

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つのステップで値を割り当てる方法は?


2
splittedString:= strings.Split("127.0.0.1:5432", ":")Ans:= splittedString[index]
分割された

回答:


249

たとえば、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

たとえば、1つのステップ

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>

これは、文字列を文字のリストではなく、文字列のリストに分割します。
dopatraman

4
IPv6アドレスを取得するとどうなりますか?
PumpkinSeed 2016年

@PumpkinSeedが試してみたところerr、残念ながらからこれが返ってきました。too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen

21

以来go柔軟ANがあるあなた自身の作成することができます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
これは、Pythonの同等のものと少し異なります。どのようにして変数戻りカウントバージョンを作成しますか?
Groxx

15
私はGoが好きですが、これをフレキシブルとは呼びません:D
Pijusn '25年

7

RemoteAddrfrom http.RequestなどのフィールドのIPv6アドレスは「[:: 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)
}

これが文字列の定義です。

// 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) }

ここにエラーがあります "./prog.go:12:17:undefined:str"
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

今、あなたのようなコードで使用ServerDetail.Hostし、ServerDetail.Port

特定の文字列を分割したくない場合は、次のようにします。

type ServerDetail struct {
    Host       string
    Port       string
}

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

およびのように使用ServerDetail.HostServerDetail.Portます。

それで全部です。


構造体フォームが機能しません:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E.アンダーソン

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])

1

補足として、Goで文字列を分割するときにセパレータを含めることができます。これを行うstrings.SplitAfterには、以下の例のように使用します。

package main

import (
    "fmt"
    "strings"
)

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

0

Golangは(Pythonとは異なり)スライスの暗黙的なアンパックをサポートしていないため、これは機能しません。上記の例のように、それを回避する必要があります。

片側注意:

暗黙的なアンパックは、goの可変個関数に対して行われます。

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.