Задать вопрос
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel

Как динамически выделить array [var]type?

Понятно, что не компилируется.
length := 7
var array [length]int

Компилируется
const length = 7
var array [length]int
//or
length := 7
slice := make([]int, length)  //we get a slice here instead of array

Во втором случае получаем slice, а не array. А я хочу именно array, что бы например контролировать allocation, снизить давление на GarbageCollector (ну или из других соображений, мало ли, не зря ведь тип array определен в языке). И хочу выделять этот array динамически.
Use case
func UseArray(length int){
    var array //of length  ???????
    for _, value := range array{  //do something with array
        fmt.Println(value)
    }
}

Вот заготовка на playground поиграться с ответами
Я пробовал с unsafe и reflect и вроде получил что то похожее на решение. Но код такой убогий, угловатый и зависящий от реализации unsafe в компиляторе, что даже стыдно его показывать. Вобщем православное решение с использованием unsafe и reflect вполне устроит.
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@rustler2000
погромист сикраш
Никак - ибо escape analysis ваш массив все равно может в хип положить.

```
package main

import (
"fmt"
)

func z(i int) {
var s [10]int
for n := 0; n < i; n++ {
s[n] = n
}
fmt.Printf("%v", s)

}
func main() {
z(10)
}

```

```
$ go build -gcflags="-m" main.go
# command-line-arguments
./main.go:12:13: s escapes to heap
./main.go:12:12: z ... argument does not escape
```
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ghostiam
На Go писатель, серверов пинатель.
Слайсы используют те же массивы под капотом.

Используя:
length := 7
slice := make([]int, length)

выделяется слайс, да, но он ровно той длины которая была задана, прямо как массив. https://play.golang.org/p/vAQqLI-msfi
Ответ написан
Комментировать
@deliro
что бы например контролировать allocation

Создавай слайс с большим capability, в чём проблема?

https://play.golang.org/p/kyM2gbCmyGW
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы