Чтобы перебрать строки в Go, вам необходимо преобразовать массив в фрагмент Go. Мы можем пропустить выделение здесь и преобразовать его напрямую (в вашем примере длина статически устанавливается равной 2, но на практике у вас, вероятно, будет другой источник для этого размера)
cSlice := (*[1 << 28]*C.char)(unsafe.Pointer(list))[:2:2]
Мы можем перебирать это напрямую, и используйте функцию C.GoString
для преобразования строк C. Это безопаснее хранить, поскольку он копирует данные в память Go, но если бы этот фрагмент был исключительно большим, мы могли бы сохранить выделение с таким же небезопасным преобразованием, как указано выше, хотя сначала вам нужно будет найти длину каждой строки.
var slice []string
for _, s := range (*[1 << 28]*C.char)(unsafe.Pointer(list))[:2:2] {
slice = append(slice, C.GoString(s))
}