วิธีการแยกสตริงและกำหนดให้กับตัวแปร


151

ใน Python มันเป็นไปได้ที่จะแบ่งสตริงและกำหนดให้กับตัวแปร:

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", ":")ตอบ: = splittedString[index]คุณสามารถเข้าถึงค่าของสตริงการแยก
muthukumar selvaraj

คำตอบ:


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

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
ฉันชอบไป แต่ฉันจะไม่เรียกสิ่งนี้ว่ายืดหยุ่น : D
Pijusn

7

ที่อยู่ 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>

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: ไม่ได้กำหนด: 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. แยกตามโครงสร้าง:

    • สร้าง struct และแยกแบบนี้

_

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
อี. แอนเดอร์สัน

1

สิ่งที่คุณกำลังทำคือคุณยอมรับการตอบสนองแบบแยกในตัวแปรที่แตกต่างกันสองรายการและ 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

ในฐานะที่เป็นบันทึกย่อด้านข้างคุณสามารถรวมตัวคั่นในขณะที่แยกสตริงในไป โดยทำstrings.SplitAfterตามตัวอย่างด้านล่าง

package main

import (
    "fmt"
    "strings"
)

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

0

Golang ไม่สนับสนุนการแกะชิ้นงานโดยปริยาย เช่นเดียวกับตัวอย่างที่ให้ไว้ข้างต้นเราจะต้องแก้ไขปัญหา

หมายเหตุด้านหนึ่ง:

การเปิดออกโดยปริยายเกิดขึ้นสำหรับฟังก์ชั่น Variadic ในระหว่างเดินทาง:

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.