Pythonでは、文字列を分割して変数に割り当てることができます。
ip, port = '127.0.0.1:5432'.split(':')
しかし、Golangでは動作しないようです:
ip, port := strings.Split("127.0.0.1:5432", ":")
// assignment count mismatch: 2 = 1
質問:ワンステップで文字列を分割して値を割り当てる方法は?
たとえば、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>
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
}
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>
文字列を分割する方法は複数あります。
_
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)
構造体に基づいて分割する:
_
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.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)
}
文字列の定義は次のとおりです。
// 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) }
Golangは(Pythonとは異なり)スライスの暗黙的なアンパックをサポートしていないため、これは機能しません。上記の例のように、それを回避する必要があります。
サイドノート:
Goの可変個の関数では、暗黙のアンパックが発生します。
func varParamFunc(params ... int){
}
varParamFunc(slice1 ...)
あなたがしていることは、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])