Как разбить строку и назначить ее переменным в Golang?
В Python можно разбить строку и присвоить ее переменным:
ip, port = '127.0.0.1:5432'.split(':')
но в Golang он не работает:
ip, port := strings.Split("127.0.0.1:5432", ":")
// assignment count mismatch: 2 = 1
Вопрос: Как разбить строку и присвоить значения за один шаг?
Ответы
Ответ 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)
}
Вывод:
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>
Ответ 2
Так как 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
}
Ответ 3
Адреса IPv6 для таких полей, как RemoteAddr
из http.Request
имеют формат "[:: 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>
Ответ 4
Существует несколько способов разделить строку:
- Если вы хотите сделать это временным, разделите так:
_
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.Host
и ServerDetail.Port
Если вы не хотите разделить конкретную строку, выполните следующие действия:
type ServerDetail struct {
Host string
Port string
}
ServerDetail = strings.Split([Your_String], ":") // Common split method
и используйте как ServerDetail.Host
и ServerDetail.Port
.
Все это.
Ответ 5
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) }
Ответ 6
Что вы делаете, вы принимаете разделенный ответ в двух разных переменных, и 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])
Ответ 7
Golang не поддерживает неявную распаковку фрагмента (в отличие от python), и по этой причине это не сработает. Как и в приведенных выше примерах, мы должны обойти это.
Примечание к одной стороне:
Неявная распаковка происходит для переменных функций в go:
func varParamFunc (params... int) {
}
varParamFunc (slice1...)