Изучаем Go. Массивы и срезы в Go. Программирование на Go #4

preview_player
Показать описание
Благодарность и задать вопрос -

Давайте глянем на массивы и срезы в Go. Массивы не сильно отличаются от срезов, можно сказать даже единственным отличием является то, что массив имеет ограниченную длину и при определении ( точнее объявлении ) массива выделяется сразу необходимое место в памяти, которое уже нельзя изменить, как и сам массив ( длину массива ). А вот срез это можно сказать динамический массив. Можно объявить пустой срез с минимальной длиной и по ходу дела добавлять или удалять из среза элементы. Но стоит учесть, что при добавлении или удалении элемента из среза, сам срез перезаписывается, т.е можно сказать появляется новая переменная, в нее записываются новые данные ( все данные из старого массива и добавляется / удаляется новый элемент ), только после этого удаляется старая переменная с данными ( это образно ). При большом срезе эта операция будет ресурсо затратна.

Домашнее задание:
просмотреть с помощью цикла любую директорию на компьютере, в которой есть папки / файлы и создать:
- массив, длинной равной количеству элементов в папке, после чего заполнить массив элементами, которые . находятся в папке ( смотрим папку - создаем массив - вписываем в массив названия папок / файлов ). В конце вывести массив и длину массива
- пустой срез, который наполнить элементами из просмотренной папки. Наполнить срез в цикле. В конце вывести срез и длину среза

Благодарность и задать вопрос -
Рекомендации по теме
Комментарии
Автор

func main() {

files, err := os.ReadDir("./dz")
if err != nil {
log.Fatal(err)
}

var fileName []string
for _, file := range files {
fileName = append(fileName, file.Name())
}

fmt.Println(len(fileName), fileName)

}

Vhoode
Автор

мое решение:
package main

import (
"fmt"
"io/ioutil"
"log"
)

func main() {

arDir, errors :=
if errors != nil {
log.Fatal(errors)
}

itemsCount := len(arDir)
slice := make([]string, 0, itemsCount)
var arr [41]string

for i, files:= range arDir{
slice = append(slice, files.Name())
arr[i] = files.Name()
}

fmt.Println(arr, len(arr))
fmt.Println(slice, len(slice))
}

zosyanax
Автор

А в чем разница между массивом который записывается с троеточием [...] и срез с пустыми скобками [ ]?

maiwan
Автор

В реальных проектах, массивы обычно не используют. Юзают именно срезы, которые называют массивами.

alexfish
Автор

Приветствую. Почему если назначить " var array := []int{1, 2, 3} " возникает ошибка синтаксиса? Потому-что переменная array зарезервирована в языке как массив? И её нельзя назначить? Или в чем проблема

АндрейВерхулин
Автор

Если я все верно понял, то должно получится вот так:

package main

import (
"fmt"
"io/ioutil"
"log"
)

func main() {

/*-- Пустой срез, который наполнить элементами из просмотренной папки. Наполнить срез в цикле. В конце вывести срез и длину среза --*/

slice := []string{}

files, err := ioutil.ReadDir(".")

if err != nil {
log.Fatal(err)
}

for _, file := range files {
slice = append(slice, file.Name())
}

fmt.Println(slice, len(slice))

/*-- Массив, длинной равной количеству элементов в папке, после чего заполнить массив элементами, которые . находятся в папке --*/

array := make([]string, len(files))

for k, v := range files {
array[k] = v.Name()
}

fmt.Println(array, len(array))

}

СергейПтушкин-кы
Автор

У меня тут небольшой вопросик по поводу домашнего задания.
>массив, длинной равной количеству элементов в папке
Это как? Длина массива должна быть фиксированной, так что var[len(sumDir)]string не работает.

pona