Я понял, что вам нужно отправлять указатель на первое значение в массиве , а не отправлять указатель на первый элемент слайса или на сам слайс.
И я также столкнулся с проблемой, когда я создал новую переменную, которой было присвоено значение первого элемента в срезе, а затем создал указатель на эту переменную (которая больше не была частью оригинальноймассив), вместо создания указателя на первый элемент в массиве (как я хотел).
Ниже приведен рабочий код с комментариями, которые помогут избежать проблемы в абзаце выше.
// Get a basic function to work, while passing in an ARRAY
// Create a dummy array of (10,20,30), the mean of which is 20.
arr := make([]C.double, 0)
arr = append(arr, C.double(10.0))
arr = append(arr, C.double(20.0))
arr = append(arr, C.double(30.0))
firstValue := &(arr[0]) // this notation seems to be pretty important... Re-use this!
// if you don't make it a pointer right away, then you make a whole new object in a different location, so the contiguous-ness of the array is jeopardized.
// Because we have IMMEDIATELY made a pointer to the original value,the first value in the array, we have preserved the contiguous-ness of the array.
fmt.Println("array length: ", len(arr))
var arrayLength C.int
arrayLength = C.int(len(arr))
// arrayLength = C.int(2)
fmt.Println("array length we are using: ", arrayLength)
arrayMean := C.pop_mean(arrayLength, firstValue)
fmt.Println("pop_mean (10, 20, 30): ", arrayMean)
Это приводит к следующему результату:
array length: 3
array length we are using: 3
pop_mean (10, 20, 30): 20
Или, если мы раскомментируем строку, которая изменяет arrayLength на 2, мы получим этот результат:
array length: 3
array length we are using: 2
pop_mean (10, 20, 30): 15