如何分割字符串并将其分配给变量


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

问题:如何在一个步骤中拆分字符串并分配值?


2
splittedString:= strings.Split("127.0.0.1:5432", ":")Ans:= splittedString[index]您可以访问
拆分

Answers:


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>

这会将字符串拆分为字符串列表,而不是字符列表。
dopatraman '16

4
如果获得IPv6地址会怎样?
南瓜种子

@PumpkinSeed刚刚尝试了一下,很err遗憾,我得到了回复:too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen

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
这与python等效项有点不同。您将如何制作可变返回计数版本?
Groxx

15
我喜欢围棋,但我不会把这种灵活的 d:
Pijusn

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. 根据struct拆分:

    • 创建一个结构并像这样拆分

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

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

现在在您的代码中使用ServerDetail.HostServerDetail.Port

如果您不想拆分特定的字符串,请按照以下步骤操作:

type ServerDetail struct {
    Host       string
    Port       string
}

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

并使用like ServerDetail.HostServerDetail.Port

就这样。


结构形式不起作用:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E. Anderson,

1

您正在做的是,您在两个不同的变量中接受拆分响应,而string.Split()仅返回一个响应,即一个字符串数组。您需要将其存储到单个变量,然后可以通过获取数组的索引值来提取字符串的一部分。

例如:

 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...)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.