2013-05-14 189 views
62

在Python,可以分割字符串,並將其分配給變量:如何分割一個字符串並將其分配給Golang中的變量?

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

但Golang它似乎並沒有工作:

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

問題:如何分割字符串並在一個步驟中分配值?

回答

116

兩個步驟,例如,

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> 
+0

這將字符串拆分爲字符串列表,而不是字符列表。 – dopatraman

+4

如果我們獲得IPv6地址會發生什麼? – PumpkinSeed

+0

@ PumpkinSeed只是試了一下,我從'err'返回,不幸的是:在地址2001中有太多冒號:0db8:85a3:0000:0000:8a2e:0370:7334' :( –

17

由於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 
} 
+0

這不止是一個與python等價物有點不同,你會如何製作一個可變回報計數版本? – Groxx

+3

我喜歡Go但我不會稱這個_flexible_:D – Pijusn

1

IPv6的像RemoteAddrhttp.Request場地址的格式爲: 「[:: 1]:53343」

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

輸出是:

127.0.0.1 5432 <nil> 
::1 2345 <nil> 
localhost 1234 <nil> 
相關問題