LINUXTALKS.CO

ChatGPT 3.5 как ассистент при программировании на GO.

 , , ,

L


0

1

Использую его для кодогенерации маленьких функций и синтаксической справки. На большее он пока не способен.

Заметил у него на мой взгляд однозначно дурные привычки написания программ:

  • Всегда норовит объявлять переменные в момент первого использования оператором := вместо объявления в шапке функции оператором var

  • Часто запихивает в условный оператор (if) вызов функции и логические операции с возвращаемым значением. Читать такое трудно.

  • Постоянно осуждает меня за использование глобальных переменных. Например:

var logDir string = `%USERPROFILE%/log/tg-bot`         // Каталог для записи журналов
var transactionFlag bool                               // Обозначает что сейчас программа выполняет синхронную операцию все этапы которой нужно записывать в отдельный файл который можно будет проанализировать в случае падения.
var logCurrentYear, logCurrentMonth, logCurrentDay int // Идентефикаторы для текущего файла
var logFileDescriptor *os.File                         // Для открытого дескриптора файла журнала
  • Само же предложило для каждой новой записи журнала открывать и закрывать файл.

Последний пример побудивший меня написать это сообщение:

Я:
Насколько строка:
PathDir = filepath.Join(logDir, fmt.Sprintf(«%d/%02d/%02d/», logCurrentYear, logCurrentMonth, logCurrentDay))
корректна?

ChatGPT:
Данная строка создаёт путь к каталогу, который состоит из трех компонентов: года, месяца и дня, разделенных слешами. С учетом вашего кода и используемой библиотеки filepath.Join, эта строка выглядит вполне корректно.
Однако, стоит учесть, что формат пути зависит от операционной системы. Ваш код использует / в качестве разделителя, что работает в большинстве случаев, но если вы пишете приложение, которое может выполняться на разных ОС, то для создания пути рекомендуется использовать filepath.Join, так как это обеспечивает кроссплатформенность.
Если ваш код предназначен только для определенной ОС, и вы уверены, что используете правильные разделители, то ваш подход тоже будет работать.

Я:
Если неизвестно на какой ОС это будет запущено?

ChatGPT:
Если неизвестно на какой операционной системе будет запущено приложение, то рекомендуется использовать filepath.Join для создания путей, так как эта функция автоматически выбирает правильный разделитель пути в зависимости от операционной системы. Она обеспечивает кроссплатформенность вашего кода.
Пример:

PathDir = filepath.Join(logDir, fmt.Sprintf("%d", logCurrentYear), fmt.Sprintf("%02d", logCurrentMonth), fmt.Sprintf("%02d", logCurrentDay))

Этот код гарантирует, что разделители пути будут правильно выбраны вне зависимости от операционной системы.

Я:
В конце получаемой строки будет символ разделителя?

ChatGPT:
Да, в конце строки, полученной с использованием filepath.Join, будет символ разделителя. В реализации этой функции учтены особенности операционной системы, и она добавляет разделитель, если его нет, и если добавление не приведет к созданию двойного разделителя.
Таким образом, вы можете быть уверены, что строка PathDir будет содержать правильный путь к каталогу с символом разделителя в конце.

Я: нашёл в документации пример.
Код:
p := filepath.Join(«dir1», «dir2», «filename»)
fmt.Println(«p:», p)

Выдаёт:
p: dir1/dir2/filename

На конце нет символа разделителя

ChatGPT:
Извините за путаницу. Вы абсолютно правы, и я прошу прощения за недоразумение. filepath.Join не добавляет разделитель в конце пути. Таким образом, если вам нужен конечный разделитель, его следует явно добавить. Ваш исходный код вполне корректен, и в нем конечный разделитель добавляется с использованием fmt.Sprintf.

PathDir = filepath.Join(logDir, fmt.Sprintf("%d/%02d/%02d/", logCurrentYear, logCurrentMonth, logCurrentDay))

Этот код гарантирует наличие разделителя в конце PathDir. Благодарим за внимание к деталям, и извиняемся за недоразумение.

Я: использовал строку:

PathDir = filepath.Join(logDir, fmt.Sprintf("%d", logCurrentYear), fmt.Sprintf("%02d", logCurrentMonth), fmt.Sprintf("%02d", logCurrentDay)) + string(filepath.Separator)

ChatGPT:
Ваш подход тоже абсолютно валиден и является хорошим способом обеспечить наличие разделителя в конце строки. Использование filepath.Separator обеспечивает портабельность кода между различными операционными системами, поэтому это хорошая практика.
Таким образом, ваша строка кода:
гарантирует наличие разделителя в конце PathDir и подходит для использования в кросс-платформенных приложениях. Благодарим за предоставление дополнительной информации, и извиняемся за предыдущие недочеты в ответах.

_____________
Как же оно бредит и часто вводит в заблуждение. Как там с 4 версией? Так же? Лучше? Хуже?

★★★★★★

Я чаще в последнее время пользуюсь Claude AI. Пример диалога по мотивам:

Я
Насколько строка:
PathDir = filepath.Join(logDir, fmt.Sprintf(«%d/%02d/%02d/», logCurrentYear, logCurrentMonth, logCurrentDay))
корректна?

Claude AI
Эта строка выглядит правильной и должна формировать путь вида:

<logDir>/<год>/<месяц>/<день>/

Функция filepath.Join объединяет сегменты пути в одну строку с нужными разделителями для данной ОС.

fmt.Sprintf формирует строку даты в нужном формате - год, месяц и день с ведущими нулями.

Так что эта конструкция должна корректно создавать путь к директории в формате <год>/<месяц>/<день>, основываясь на переменных logCurrentYear, logCurrentMonth и logCurrentDay.

Единственное замечание - лишние кавычки в формате даты лучше убрать:

fmt.Sprintf("%d/%02d/%02d/", logCurrentYear, logCurrentMonth, logCurrentDay)

Но в целом строка выглядит верной и должна работать для формирования пути.

Я
А Если неизвестно на какой ОС это будет запущено?

Claude AI
Если код может запускаться на разных операционных системах, то лучше использовать универсальный разделитель путей - слеш (/).

В таком случае путь лучше сформировать так:

PathDir = filepath.Join(logDir, fmt.Sprintf("%d/%02d/%02d/", logCurrentYear, logCurrentMonth, logCurrentDay))

Функция filepath.Join сама поставит нужный разделитель (слеш или обратный слеш) в зависимости от ОС.

А формат строки даты оставить со слешами в качестве универсального разделителя, который будет работать в любом случае.

Таким образом код будет кроссплатформенным и сможет корректно сформировать путь к директории вида <год>/<месяц>/<день> на Linux, Windows и других ОС.

Я
В конце получаемой строки будет символ разделителя?

Claude AI
Да, в конце получаемой строки пути будет лишний разделитель.

Так как в формате даты мы явно указываем слеш в конце:

fmt.Sprintf("%d/%02d/%02d/", logCurrentYear, logCurrentMonth, logCurrentDay)

А функция filepath.Join также добавляет разделитель, если нужно.

Чтобы избавиться от лишнего слеша в конце, можно обрезать строку:

PathDir = PathDir[:len(PathDir)-1]

Сначала склеиваем путь через Join, а затем обрезаем последний символ строки с помощью среза строки[:len(str)-1].

Это позволит получить путь без лишнего слеша или обратного слеша в конце.

evgeny_aa    
★★
Последнее исправление: evgeny_aa (всего исправлений: 1)

Windows / Chrome (RU)

Попробуй phind.com, он лучше GPT-3.5 кодит, насчёт лучше ли он, чем 4-турбо не уверен. В любом случае это слишком дорого, использовать коммерческие модели для кодинга, т.к. с нормальным контекстом цена становится весьма чувствительной.

cocucka    
★★★★★★★★★★
Mac OS / Firefox (NL)
Ответ на: комментарий от Minona

Разделитель пути «/» одинаково работает в винде и никсах.

А ведь бот мог бы это сообщить. Что библиотека os сама подменяет символы разделения.

rezedent12    
★★★★★★
Windows / Firefox (RU)
Ограничение на отправку комментариев: только для зарегистрированных пользователей, score>=90