Как сделать ломтик с Dynami c размер / длина / емкость - PullRequest
0 голосов
/ 08 марта 2020

Мне кажется, что я могу создать срез с динамическими c размер / емкость / длина / что угодно, используя:

cleaned := []interface{}{}

как я могу сделать то же самое с make()? Я попробовал это:

cleaned := make([]interface{})

но он хочет, чтобы я включил длину?

Отсутствует аргумент len для создания

Ответы [ 2 ]

2 голосов
/ 08 марта 2020
cleaned := []interface{}{}

как мне сделать то же самое с make ()?


Например,

package main

import (
    "fmt"
)

func main() {
    {
        cleaned := []interface{}{}
        fmt.Println(len(cleaned), cap(cleaned), cleaned)
    }

    // OR

    {
        cleaned := make([]interface{}, 0)
        fmt.Println(len(cleaned), cap(cleaned), cleaned)
    }

    // OR

    {
        cleaned := make([]interface{}, 0, 0)
        fmt.Println(len(cleaned), cap(cleaned), cleaned)
    }
}

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

Вывод:

0 0 []
0 0 []
0 0 []

Ссылка:

Спецификация Go языка программирования n: Создание ломтиков , maps and channe



Комментарий: jetbrains жалуется и говорит пустое объявление среза через литерал и предлагает заменить его на var cleaned [] interface {}, но неясно, почему? - Олегзандр Денман


Это другой вопрос. Причина ясна.

Go Комментарии к обзору кода : Объявление пустых фрагментов

При объявлении пустого фрагмента предпочитайте

var t []string

over

t := []string{}

Первый объявляет нулевое значение среза, а второй не ноль, но нулевой длины. Они функционально эквивалентны - их len и cap равны нулю, но срез nil является предпочтительным стилем.

. , .

Например,

package main

import (
    "fmt"
)

func main() {
    {
        cleaned := []interface{}{}
        fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
    }

    // OR

    {
        cleaned := make([]interface{}, 0)
        fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
    }

    // OR

    {
        cleaned := make([]interface{}, 0, 0)
        fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
    }

    // OR

    {
        var cleaned []interface{}
        fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
    }
}

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

Выход:

0 0 [] false
0 0 [] false
0 0 [] false
0 0 [] true
1 голос
/ 08 марта 2020

У вас есть два метода:

  1. Использование cleaned := make([]interface{},0) и вызов cleaned = append(cleaned, your_data)
  2. Объявление пустого массива: var cleaned []interface{}
...