Как создать добавленную шестнадцатеричную строку 0x из шестнадцатеричной строки для каждого байта шестнадцатеричных символов в golang? - PullRequest
0 голосов
/ 18 февраля 2020

Используя следующее в качестве отправной точки, я смог получить что-то работающее.

Как вставить символ каждые X символов в строку в Golang?

Но Я хочу знать, есть ли идиоматический c способ написать golang для того, что я хочу сделать, что является выводом первого fmt.Println, показанного ниже:
package main

import (
    "bytes"
    "fmt"
)

func insertStringInto(s string, interval int, sep string) string {
    var buffer bytes.Buffer
    before := interval - 1
    last := len(s) - 1
    for i, char := range s {
        buffer.WriteRune(char)
        if i%interval == before && i != last {
            buffer.WriteString(sep)
        }
    }
    return buffer.String()
}


func main() {
    fmt.Println("0x" + insertStringInto("01234567891011121314151617181920", 2, ", 0x"))

    fmt.Println(insertStringInto("01234567891011121314151617181920", 2, ", 0x"))
}

Производит следующее:

0x01, 0x23, 0x45, 0x67, 0x89, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20
01, 0x23, 0x45, 0x67, 0x89, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20

Ссылка на игру. golang .org ниже:

https://play.golang.org/p/TvLFAKsrcCB

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Я не уверен, как это идиоматизм c, но повторная нарезка строк часто используется для такого рода вещей. Также strings.builder был представлен недавно.

func insertInto(s string, interval int, prefix, sep string) string {
    sb := strings.Builder{}
    sb.Grow((len(s)/interval+1)*(interval+len(prefix)+len(sep)))

    first := true
    for i := 0; i < len(s)/interval; i++ {
        if first {
            first = false
        } else {
            sb.WriteString(sep)
        }
        sb.WriteString(prefix)
        sb.WriteString(s[i*interval :(i+1)*interval])
    }
    return sb.String()
}

...
    print(insertInto("0123456789101112131415161718192", 2, "0x", ", "))

Обратите внимание, что это не пытается проверить, что строка содержит только шестнадцатеричные цифры. Также предполагается, что это кратное interval, но его можно легко настроить.

0 голосов
/ 18 февраля 2020

Вы можете использовать регулярное выражение

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func AnotherWay(s string, after int, sep string) string {
    ex, _ := regexp.Compile(`([0-9]{2})`)
    return strings.TrimSuffix(ex.ReplaceAllString(s, sep+"$1, "), ", ")
}

func main() {
    fmt.Println(AnotherWay("01234567891011121314151617181920", 2, "0x"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...