Реализация интерпретатора комментариев JSON

GolangGolangBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь реализовывать интерпретатор комментариев JSON. Это полезная функция при работе с файлами конфигурации JSON, так как позволяет добавлять комментарии для объяснения причины определенных настроек.

👀 Предварительный просмотр

$ /usr/local/go/bin/go test
PASS
ok      jsonex  0.002s

🎯 Задачи

В этом проекте вы научитесь:

  • Как инициализировать модуль Go и настроить необходимую среду
  • Как реализовать функцию разбора комментариев JSON, которая поддерживает символ # в качестве комментария
  • Как обрабатывать случаи, когда символ " является частью содержимого строки
  • Как протестировать функцию разбора комментариев JSON

🏆 Достижения

После завершения этого проекта вы сможете:

  • Разобраться, как работать с модулями Go и настраивать разработочную среду
  • Реализовать пользовательский парсер JSON, поддерживающий комментарии
  • Писать тесты для гарантии правильности функции разбора комментариев JSON
  • Применить свои новые знания для улучшения файлов конфигурации на основе JSON с информативными комментариями

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/AdvancedTopicsGroup(["Advanced Topics"]) go(("Golang")) -.-> go/TestingandProfilingGroup(["Testing and Profiling"]) go(("Golang")) -.-> go/CommandLineandEnvironmentGroup(["Command Line and Environment"]) go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go/DataTypesandStructuresGroup -.-> go/strings("Strings") go/FunctionsandControlFlowGroup -.-> go/functions("Functions") go/AdvancedTopicsGroup -.-> go/json("JSON") go/TestingandProfilingGroup -.-> go/testing_and_benchmarking("Testing and Benchmarking") go/CommandLineandEnvironmentGroup -.-> go/command_line("Command Line") go/CommandLineandEnvironmentGroup -.-> go/environment_variables("Environment Variables") subgraph Lab Skills go/strings -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} go/functions -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} go/json -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} go/testing_and_benchmarking -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} go/command_line -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} go/environment_variables -.-> lab-301258{{"Реализация интерпретатора комментариев JSON"}} end

Инициализация проекта

В этом шаге вы научитесь инициализировать проект и настроить необходимую среду. Следуйте шагам ниже, чтобы выполнить этот шаг:

  1. Откройте терминал и перейдите в каталог /home/labex/project.

  2. Инициализируйте модуль Go с помощью следующей команды:

    $ /usr/local/go/bin/go mod init jsonex
  3. Установите необходимые пакеты, выполнив следующую команду:

    $ /usr/local/go/bin/go get github.com/stretchr/testify/assert

Реализовать функцию разбора комментариев JSON

В этом шаге вы научитесь реализовывать функцию разбора комментариев JSON. Следуйте шагам ниже, чтобы выполнить этот шаг:

  1. Откройте файл jsonex.go в редакторе.

  2. Функция Unmarshal разбирает JSON закодированные данные и сохраняет результат.

    • Поддерживать # в качестве символа комментария в JSON, и все, что находится после этого символа, должно считаться комментарием.
    • Когда " является частью содержимого строки, она должна быть представлена в виде \", а \ должен быть представлен в виде \\.
  3. Реализовать функцию trimCommentsLine, чтобы проверить, является ли строка комментарием или нет. Если это не комментарий, вернуть саму строку.

  4. Полный код функции trimCommentsLine должен быть следующим:

    // trimCommentsLine проверяет, является ли строка комментарием или нет, если нет, возвращает саму строку
    func trimCommentsLine(line []byte) []byte {
    	var newLine []byte
    	var i, quoteCount int
    	lastIdx := len(line) - 1
    	for i = 0; i <= lastIdx; i++ {
    		// если символ '\'
    		if line[i] == '\\' {
    			// если индекс не последний, проверить, является ли следующий символ '"' или '\', если да, добавить его
    			if i!= lastIdx && (line[i+1] == '\\' || line[i+1] == '"') {
    				newLine = append(newLine, line[i], line[i+1])
    				i++
    				continue
    			}
    		}
    
    		// если символ '"', увеличить quoteCount
    		if line[i] == '"' {
    			quoteCount++
    		}
    
    		// если символ '#'
    		if line[i] == '#' {
    			// если quoteCount четное, прервать, потому что '#' не находится в строке,
    			// находится в комментарии
    			if quoteCount%2 == 0 {
    				break
    			}
    		}
    
    		newLine = append(newLine, line[i])
    	}
    
    	return newLine
    }

Протестировать функцию разбора комментариев JSON

В этом шаге вы научитесь тестировать функцию разбора комментариев JSON. Следуйте шагам ниже, чтобы выполнить этот шаг:

  1. Откройте терминал и перейдите в каталог /home/labex/project.

  2. Выполните следующую команду для запуска тестов:

    $ cd /home/labex/project
    $ /usr/local/go/bin/go test
  3. Если тесты пройдены, вы увидите следующий вывод:

    PASS
    ok      jsonex  0.002s
  4. Если вы столкнулись с ошибкой по таймауту, выполните следующие команды в терминале, а затем нажмите кнопку "Проверить снова", чтобы пройти проверку:

    $ cd /home/labex/project
    $ /usr/local/go/bin/go test

Поздравляем! Вы успешно реализовали функцию разбора комментариев JSON и протестировали ее. Теперь вы можете использовать эту функцию в своем проекте.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.