如何拆分字符串并将其分配给Golang中的变量?

时间:2013-05-14 19:31:43

标签: string go split

在Python中,可以拆分字符串并将其分配给变量:

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

但在Golang中它似乎不起作用:

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

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

9 个答案:

答案 0 :(得分:205)

两个步骤,例如

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>

答案 1 :(得分:20)

由于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
}

答案 2 :(得分:5)

来自RemoteAddr的{​​{1}}字段的IPv6地址格式为“[:: 1]:53343”

所以http.Request效果很好:

package main

net.SplitHostPort

输出是:

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

答案 3 :(得分: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

,并像ServerDetail.HostServerDetail.Port这样使用。

仅此而已。

答案 4 :(得分:1)

RewriteRule . index.php [L]

这是字符串的定义。分割

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

答案 5 :(得分: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
}

答案 6 :(得分:0)

您正在做的是,您在两个不同的变量中接受拆分响应,而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])

答案 7 :(得分:0)

Golang不支持切片的隐式解压缩(与python不同),这就是这不起作用的原因。像上面给出的示例一样,我们需要解决它。

旁注:

隐式解压缩发生在go中的可变参数函数上:

func varParamFunc(params ... int){

}

varParamFunc(slice1 ...)

答案 8 :(得分:0)

作为旁注,您可以在Go中拆分字符串时包括分隔符。为此,请按照以下示例使用<pre>Traceback (most recent call last): File &quot;/usr/lib/python3.6/runpy.py&quot;, line 193, in _run_module_as_main &quot;__main__&quot;, mod_spec) File &quot;/usr/lib/python3.6/runpy.py&quot;, line 85, in _run_code exec(code, run_globals) File &quot;/home/kivy/Desktop/GUI Example/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py&quot;, line 1196, in &lt;module&gt; main() File &quot;/home/kivy/Desktop/GUI Example/.buildozer/android/platform/python-for-android/pythonforandroid/entrypoints.py&quot;, line 18, in main ToolchainCL() File &quot;/home/kivy/Desktop/GUI Example/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py&quot;, line 657, in __init__ self.ctx.setup_dirs(self.storage_dir) File &quot;/home/kivy/Desktop/GUI Example/.buildozer/android/platform/python-for-android/pythonforandroid/build.py&quot;, line 169, in setup_dirs raise ValueError(&apos;storage dir path cannot contain spaces, please &apos; ValueError: storage dir path cannot contain spaces, please specify a path with --storage-dir <font color="#AA0000"># Command failed: /usr/bin/python3 -m pythonforandroid.toolchain create --dist_name=myapp --bootstrap=sdl2 --requirements=python3,kivy --arch armeabi-v7a --copy-libs --color=always --storage-dir=&quot;/home/kivy/Desktop/GUI Example/.buildozer/android/platform/build-armeabi-v7a&quot; --ndk-api=21</font> <font color="#AA0000"># ENVIRONMENT:</font> </pre>

strings.SplitAfter