Vasily
В смысле нету?
Vasily
Структура - это сравниваемый тип
Vasily
В случае если её типы сравниваемые
Vasily
https://golang.org/ref/spec#Comparison_operators
Vasily
Если не сравниваемые - DeepEqual как подсказывают выше
Dmitry
А если будет слайс в структуре, как тогда сравнение пройдёт?
Vasily
нет, слайс только с nil сравнить можно через ==
Vasily
если слайс - то тебе в DeepEqual
Vasily
потому что это не сравниваемый тип. и структура с после типа слайс тоже будет енсравниваемой
Dmitry
Ага, прочитал по твоей ссылке
Anonymous
мапа тоже не сравниваемый
Anonymous
2 самых распространненых типа не сравниваемые
Valentin
Сравниваемый, только указатели, а не значения -)
Anonymous
ну и нах это надо )
Anonymous
2 самых распространненых типа не сравниваемые
У авторов Go особый взляд на нужный функционал языка. Например, нет ещё нескольких часто используемых вещей. Пара штук из того, что я встретил: - нет функции проверки наличия файлов - нет функции копирования файлов
nikita
по-моему прочитать из файла сразу в новый это очень красиво )
Anonymous
1) stat же есть? 2) https://golang.org/pkg/io/#Copy, да придётся самому открывать файлы, но зато не будет возникать вопросов :)
1. Я бы хотел одну функцию fileExists(), а не две 2. copy(dst, src) - ещё короче и без вопросов
Илья
Anonymous
что мешает сделать себе file.utils на github и пользовать? :)
Лучше я форкну Go. Будет у меня версия с блекджеком 😄
Илья
просто я не понимаю, почему это должно быть частью стандартной библиотеки, если это реализуется в 3-5 строк? :)
Илья
то, что сделали copy/copybuffer/copyn - вот это круто :)
ceiling cat
Сахар лишним не бывает :)
Anonymous
просто я не понимаю, почему это должно быть частью стандартной библиотеки, если это реализуется в 3-5 строк? :)
Ну с такой политикой можно порезать все функции длиннее трёх строк. Не долго же написать самому! )) Плохо то, что смысл не сразу видно. А одна функция isFileExists() - смысл сразу виден
Dmitry
или os.Stat()
Anonymous
потому что Go очень похож на C FILE *file; if ((file = fopen(fname, "r")) == NULL) { printf("file doesn't exists"); } return 0;
Не шарю в C, но в printf должен быть "немогу открыть файл". Т.к. файл может быть, но прав на него нет.
Dmitry
Не шарю в C, но в printf должен быть "немогу открыть файл". Т.к. файл может быть, но прав на него нет.
верно FILE *file; if ((file = fopen(fname, "r")) == NULL) { if (errno == ENOENT) { printf("File doesn't exist"); } else { // Check for other errors too, like EACCES and EISDIR printf("Some other error occured"); } } else { fclose(file); } return 0;
Ivan
Some other error - какая жесть. А как же perror иже с ним?
Dmitry
это не так важно в вопросе проверки существования файла))
Anonymous
Если в стандартную либу добавить isFileExist, то а) обратная совместимость не поломается б) будет рад как минимум один прогер (я 😄). Минусов не вижу ))
Stepan
Я заранее извиняюсь за тупые вопросы. Скажите кто что использует для конфигурационных файлов?
Anonymous
viper
Dmitry
Если в стандартную либу добавить isFileExist, то а) обратная совместимость не поломается б) будет рад как минимум один прогер (я 😄). Минусов не вижу ))
обычно проверяют создан ли файл, если хотят его открыть, то можно использовать os.OpenFile с флагом O_CREATE
Stepan
@NXShock , @antelman спасибо
Anonymous
обычно проверяют создан ли файл, если хотят его открыть, то можно использовать os.OpenFile с флагом O_CREATE
Если бы у авторов Go была такая политика, они бы не ввели бы os.Create. Ведь есть же os.OpenFile(name, O_CREATE). Так что дело в чём-то другом.
Dmitry
http://man7.org/linux/man-pages/man2/open.2.html
Alexander
А мне нравится, что нет isfileexists. Нафиг лишнее действие? Сразу говоришь, 'открой файл'. А если его нет, или еще какая то беда, тогда отлавливаешь ошибку.
ceiling cat
но ошибок может быть много, не?
Alexander
Ну и отлично. видишь ошибку. Мне кажется это лучше, чем isfileexist, isfilereadonly, isfileчтототам
Alexander
А если нужно просто проверить наличие файла, то чтото неверно в постановке задачи 😄
Anonymous
А если нужно просто проверить наличие файла, то чтото неверно в постановке задачи 😄
Например, нужно откопировать файлы из одного каталога в другой. Если файл в целевом каталоге существует, НЕ перезаписывать его.
Anonymous
Сэкономлю аж 2 строчки при юзании isFileExist 😄
Anonymous
а то, что round нет?
Aleksandr
а то, что round нет?
но будет же
Alexander
Я бы попросил это сделать оболочку )
Alexey 〒.
nikita
Anonymous
в красивом будет другой метод?
В красивом будет os.IsFileExists(filename) bool
Alexey 〒.
Выше писал, что решение есть, но оно не красивое.
ну напиши свою либу utils и используй во всех проектах)
nikita
В красивом будет os.IsFileExists(filename) bool
filePath := "/path/to/file" if !os.Stat(filePath) { printf("File doesn't exist"); } file, err := os.Open(filePath) if err != nil { panic(err) } или filePath := "/path/to/file" file, err := os.Open(filePath) if err != nil { panic(err) } я правда не понимаю, в чем смысл)
nikita
error все равно будет
nikita
ну вставь switch если хочешь обработать отдельно, все равно лучше не будет
Anonymous
Смысл в том, что сразу понятно назначение кода.
Alexey 〒.
ну заменишь _, err := os.Stat("/path/to/file"); !os.IsNotExist(err) на isExist("...") Сильно читаемость повысится?
Alexey 〒.
if все равно останется, будет лишь немного короче
Anonymous
дай пример кода, правда
if !os.IsFileExists("file.txt") { fmt.Println("Файл не существует") }
nikita
if !os.IsFileExists("file.txt") { fmt.Println("Файл не существует") }
думаешь чего больше, кейсов, когда надо проверить , есть ли файл или тех, где потом с ним надо работать?
nikita
Это плохой принцип не писать тот код, что редко используется.
дело в том, что код для второго случая покрывает первый
Anonymous
дело в том, что код для второго случая покрывает первый
Зачем тогда в пакете есть os.Create, когда его покрывает os.OpenFile?
nikita
Зачем тогда в пакете есть os.Create, когда его покрывает os.OpenFile?
не знаю, может потому что его чаще используют?
Alexey 〒.
Зачем тогда в пакете есть os.Create, когда его покрывает os.OpenFile?
загляни в create он вызывает openfile func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) }
nikita
он про это и говорит