Как эффективно преобразовать строку в байтовый фрагмент, включая последний 0, в Go? - PullRequest
0 голосов
/ 13 июня 2018

Я хотел бы преобразовать строку в байтовый фрагмент, включая последний символ 0.

Мне известно, что следующий код преобразует строку в фрагмент:

my_slice := []byte("abc")

И что следующий код может добавить последние 0 символов:

my_slice = append(my_slice , 0)

Но мне интересно, может ли это быть сделано более эффективно, возможно, в 1 строку, поскольку обе строки будут выделять память.

Неэффективный пример: https://play.golang.org/p/Rg6ri3H66f9

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Эффективный однострочный метод - это встроенный вызов функции.Например,

package main

import "fmt"

func cstring(s string) []byte {
    b := make([]byte, len(s)+1)
    copy(b, s)
    return b
}

func main() {
    s := "abc"
    fmt.Printf("%q\n", s)

    c := cstring(s) // inlining call to cstring

    fmt.Printf("%q\n", c)
}

решения по оптимизации:

$ go tool compile -m cstring.go
cstring.go:5:6: can inline cstring
cstring.go:15:14: inlining call to cstring
cstring.go:6:11: make([]byte, len(s) + 1) escapes to heap
cstring.go:5:14: cstring s does not escape
cstring.go:13:13: s escapes to heap
cstring.go:15:14: make([]byte, len(s) + 1) escapes to heap
cstring.go:17:13: c escapes to heap
cstring.go:13:12: main ... argument does not escape
cstring.go:17:12: main ... argument does not escape
$

Вывод:

$ go run cstring.go
"abc"
"abc\x00"
$

Детская площадка: https://play.golang.org/p/7gi9gR7iWkS

0 голосов
/ 13 июня 2018

Выделите срез желаемой длины.Скопируйте строку в слайс.

s := "abc"
my_slice := make([]byte, len(s)+1)
copy(my_slice, s)

Нет необходимости устанавливать последний элемент в ноль, потому что make возвращает слайс со всеми элементами, установленными в ноль.

...