РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1583 of 1593 menu

Функция C.GoStringN

Функция C.GoStringN преобразует C-строку (указатель на char) в строку Go, используя заданное количество байт. В отличие от C.GoString, она не требует, чтобы C-строка заканчивалась нулевым символом. Первый параметр — указатель на C-строку (тип *C.char), второй — количество байт (тип C.int), которое нужно скопировать. Функция возвращает строку Go, содержащую ровно указанное количество байт из C-строки.

Синтаксис

C.GoStringN(cstr, n)

Базовый пример

Давайте преобразуем C-строку фиксированной длины в строку Go:

package main /* #include <stdlib.h> #include <string.h> */ import "C" import "fmt" func main() { cstr := C.CString("abcde") defer C.free(unsafe.Pointer(cstr)) // Преобразуем первые 3 байта res := C.GoStringN(cstr, 3) fmt.Println(res) }

Результат выполнения кода:

"abc"

Работа с бинарными данными

Поскольку C.GoStringN не требует завершающего нуля, она идеально подходит для обработки бинарных данных или строк, содержащих нулевые байты:

package main /* #include <stdlib.h> #include <string.h> */ import "C" import "fmt" import "unsafe" func main() { // Создаем C-строку с нулевым байтом внутри data := []byte{'a', 'b', 0, 'c', 'd'} cstr := (*C.char)(unsafe.Pointer(&data[0])) // Преобразуем все 5 байт res := C.GoStringN(cstr, C.int(len(data))) fmt.Printf("%q (len=%d)\n", res, len(res)) }

Результат выполнения кода:

"ab\x00cd" (len=5)

Сравнение с C.GoString

Покажем разницу между C.GoStringN и C.GoString на примере строки с нулевым байтом:

package main /* #include <stdlib.h> #include <string.h> */ import "C" import "fmt" import "unsafe" func main() { data := []byte{'a', 'b', 0, 'c', 'd'} cstr := (*C.char)(unsafe.Pointer(&data[0])) // C.GoStringN копирует все 5 байт res1 := C.GoStringN(cstr, 5) fmt.Printf("GoStringN: %q (len=%d)\n", res1, len(res1)) // C.GoString остановится на нулевом байте res2 := C.GoString(cstr) fmt.Printf("GoString: %q (len=%d)\n", res2, len(res2)) }

Результат выполнения кода:

"GoStringN: \"ab\\x00cd\" (len=5)" "GoString: \"ab\" (len=2)"

Смотрите также

  • функцию C.GoString,
    которая преобразует C-строку с нулевым завершением в Go-строку
  • функцию C.CString,
    которая создает C-строку из Go-строки
  • функцию C.GoBytes,
    которая преобразует C-массив байт в Go-слайс
  • функцию C.CBytes,
    которая создает C-массив байт из Go-слайса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить