String 如何拆分字符串并将其分配给变量
在Python中,可以拆分字符串并将其分配给变量:String 如何拆分字符串并将其分配给变量,string,go,split,String,Go,Split,在Python中,可以拆分字符串并将其分配给变量: ip, port = '127.0.0.1:5432'.split(':') 但在Go中,它似乎不起作用: ip, port := strings.Split("127.0.0.1:5432", ":") // assignment count mismatch: 2 = 1 问题:如何在一个步骤中拆分字符串并赋值?例如,两个步骤 package main import ( "fmt" "strings" ) func
ip, port = '127.0.0.1:5432'.split(':')
但在Go中,它似乎不起作用:
ip, port := strings.Split("127.0.0.1:5432", ":")
// assignment count mismatch: 2 = 1
问题:如何在一个步骤中拆分字符串并赋值?例如,两个步骤
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)
}
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
127.0.0.1 5432 <nil>
比如说一步,
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)
}
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
127.0.0.1 5432 <nil>
127.0.0.15432
由于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
}
主程序包
进口(
“fmt”
“字符串”
“错误”
)
键入PyString字符串
func main(){
var py PyString
py=“127.0.0.1:5432”
ip,端口,错误:=py.Split(“:”//Python样式
fmt.Println(ip、端口、错误)
}
func(py PyString)Split(str string)(string,string,error){
s:=strings.Split(string(py),str)
如果len(s)<2{
返回“”,错误。新建(“未找到最小匹配项”)
}
返回s[0],s[1],零
}
来自http.Request
的RemoteAddr
等字段的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>
127.0.0.15432
::1 2345
本地主机1234
拆分字符串有多种方法:
- 创建一个结构并像这样拆分
ServerDetail.Host
和ServerDetail.Port
如果不想拆分特定字符串,请按如下方式执行:
type ServerDetail struct {
Host string
Port string
}
ServerDetail = strings.Split([Your_String], ":") // Common split method
并使用类似于ServerDetail.Host
和ServerDetail.Port
就这些
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) }
您要做的是,在两个不同的变量中接受split响应,strings.split()只返回一个响应,这是一个字符串数组。您需要将其存储到单个变量中,然后通过获取数组的索引值来提取字符串的一部分 例如:
var hostAndPort string
hostAndPort = "127.0.0.1:8080"
sArray := strings.Split(hostAndPort, ":")
fmt.Println("host : " + sArray[0])
fmt.Println("port : " + sArray[1])
Golang不支持片段的隐式解包(与python不同),这就是它不起作用的原因。像上面给出的例子一样,我们需要解决这个问题 一个旁注: go中变量函数的隐式解包:
func varParamFunc(params ...int) {
}
varParamFunc(slice1...)
作为旁注,您可以在Go中拆分字符串时包含分隔符。为此,请使用以下示例中的
strings.SplitAfter
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Printf("%q\n", strings.SplitAfter("z,o,r,r,o", ","))
}
这会将字符串拆分为字符串列表,而不是字符列表。如果我们获得IPv6地址,会发生什么情况?@Pumpkinsed刚刚尝试过,我从
err
中得到了这个结果,不幸的是:地址2001:0db8:85a3:0000:0000:8a2e:0370:7334中的冒号太多了:(@dopatraman你为什么这么说?这个问题是关于将一个字符串拆分成一个字符串列表的,不是吗?这与python的等价物有点不同。你如何制作一个可变返回计数版本?我喜欢Go,但我不会称之为灵活的:DsplittedString
:=strings.Split(“127.0.1:5432”,“:”)
Ans:=splittedString[index]
您可以访问splittedString的值这里有一个错误“/prog.go:12:17:undefined:str”结构表单不工作:/prog.go:21:4:赋值不匹配:1个变量,但net.SplitHostPort返回3个值