简体   繁体   中英

How can I iterate over each 2 consecutive characters in a string in go?

I have a string like this:

package main

import "fmt"

func main() {
    some := "p1k4"

    for i, j := range some {
            fmt.Println()
    }
}

I want take each two consecutive characters in the string and print them. the output should like p1, 1k, k4, 4p .

I have tried it and still having trouble finding the answer, how should I write the code in go and get the output I want?

package main

import (
    "fmt"
)

func main() {
    str := "12345"
    for i := 0; i < len(str); i++ {
        fmt.Println(string(str[i]) + string(str[(i+1)%len(str)]))
    }

}

Go stores strings in memory as their UTF-8 encoded byte sequence. This maps ASCII charactes one-to-one in bytes, but characters outside of that range map to multiple bytes.

So I would advise to use the for range loop over a string, which ranges over the runes (characters) of the string, properly decoding multi-byte runes. This has the advantage that it does not require allocation (unlike converting the string to []rune ). You may also print the pairs using fmt.Printf("%c%c", char1, char2) , which also will not require allocation (unlike converting rune s back to string and concatenating them).

To learn more about strings, characters and runes in Go, read blog post: Strings, bytes, runes and characters in Go

Since the loop only returns the "current" rune in the iteration (but not the previous or the next rune), use another variable to store the previous (and first) runes so you have access to them when printing.

Let's write a function that prints the pairs as you want:

func printPairs(s string) {
    var first, prev rune
    for i, r := range s {
        if i == 0 {
            first, prev = r, r
            continue
        }
        fmt.Printf("%c%c, ", prev, r)
        prev = r
    }
    fmt.Printf("%c%c\n", prev, first)
}

Testing it with your input and with another string that has multi-byte runes:

printPairs("p1k4")
printPairs("Go-世界")

Output will be (try it on the Go Playground ):

p1, 1k, k4, 4p
Go, o-, -世, 世界, 界G

This is a simple for loop over your string with the first character appended at the back:

package main

import "fmt"

func main() {
    some := "p1k4"
    ns := some + string(some[0])
    for i := 0; i < len(ns)-1; i++ {
        fmt.Println(ns[i:i+2])
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM