문자열을 나누고 변수에 할당하는 방법


151

파이썬에서는 문자열을 분할하여 변수에 할당 할 수 있습니다.

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

그러나 Go에서는 작동하지 않는 것 같습니다.

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

질문 : 문자열을 분할하고 한 번에 값을 할당하는 방법은 무엇입니까?


2
splittedString: = strings.Split("127.0.0.1:5432", ":")Ans : = splittedString[index]당신은
쪼개진

답변:


249

예를 들어 두 단계

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>

문자열을 문자 목록이 아닌 문자열 목록으로 분할합니다.
dopatraman 2016 년

4
IPv6 주소를 받으면 어떻게됩니까?
PumpkinSeed

@PumpkinSeed는 그것을 시도했지만 err불행히도 에서 이것을 다시 얻습니다 . too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen

21

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
}

1
이것은 파이썬과 동등한 것 이상입니다. 가변 수익률 버전을 어떻게 만드시겠습니까?
Groxx

15
나는 Go를 좋아하지만 나는 이것을 유연하게 부르지 않을 것입니다 : D
Pijusn

7

RemoteAddrfrom 과 같은 필드의 IPv6 주소는 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>

2
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) }

여기에 오류가 있습니다 "./prog.go:12:17 : undefined : str"
Anshu

1

문자열을 분할하는 방법에는 여러 가지가 있습니다.

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

특정 문자열을 나누지 않으려면 다음과 같이하십시오.

type ServerDetail struct {
    Host       string
    Port       string
}

ServerDetail = strings.Split([Your_String], ":") // Common split method

와 같이 사용 ServerDetail.Host하고 ServerDetail.Port.

그게 다야.


struct 형식이 작동하지 않습니다 :./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E. Anderson

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

1

참고로, Go에서 문자열을 분할하는 동안 구분 기호를 포함시킬 수 있습니다. 이렇게하려면 strings.SplitAfter아래 예와 같이 사용 하십시오.

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Printf("%q\n", strings.SplitAfter("z,o,r,r,o", ","))
}

0

Golang은 (파이썬과 달리) 슬라이스의 암시 적 압축 풀기를 지원하지 않으므로 이것이 작동하지 않습니다. 위에 제공된 예와 같이 해결 방법이 필요합니다.

한 쪽 참고 :

암시 적 언 패킹은 다양한 가변 함수에 대해 발생합니다.

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)

0
**In this function you can able to split the function by golang using array of strings**

func SplitCmdArguments(args []string) map[string]string {
    m := make(map[string]string)
    for _, v := range args {
        strs := strings.Split(v, "=")
        if len(strs) == 2 {
            m[strs[0]] = strs[1]
        } else {
            log.Println("not proper arguments", strs)
        }
    }
    return m
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.