Подтвердить что ты не робот

Как разбить строку и назначить ее переменным в 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

Вопрос: Как разбить строку и присвоить значения за один шаг?

4b9b3361

Ответ 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

Существует несколько способов разделить строку:

  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. Разделить на основе структуры:

    • Создайте структуру и разделите ее так

_

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