Go - это язык программирования общего назначения, основанный еще в 2009 году. В наши дни он является фаворитом для выполнения задач, связанных с веб-серверами, микросервисами, машинным обучением и т. Д. Вы можете ознакомиться с некоторыми компаниями, использующими Go, здесь.

В этой статье основное внимание уделяется настройке Visual Studio Code (VSCode) в качестве IDE для Go. Конечно, существуют и другие альтернативы, такие как Vim (с плагином vim-go), Atom IDE (с пакетом go-plus), Goland от IntelliJ, и это лишь некоторые из них. Однако на данный момент VSCode - это надежная IDE для разработки Go с таким количеством функций и расширений, которые расширяют ее возможности.

Хорошо, так что давайте перейдем к этому.

Начальная настройка

Первое, что нужно сделать, это запустить VSCode, а затем установить плагин ms-vscode.go. Этот плагин можно установить, выполнив поиск в Marketplace (Ctrl (или Cmd) + Shift + X), или вы можете пойти вправо. вперед и откройте свой рабочий каталог, а затем создайте файл Go с расширением .go.

Если вы выбрали второй вариант, вы должны увидеть запрос на установку расширения ms-vscode.go. После подтверждения и завершения установки у вас должен быть богатый набор инструментов для программирования на Go.

В любом случае вам нужно будет перезапустить VSCode. Нажатие кнопки перезагрузить, как показано ниже, должно помочь.

Инструмент форматирования

По умолчанию goimports является инструментом форматирования по умолчанию для файлов .go в VSCode. Однако, если по какой-либо причине вам необходимо это изменить, вы можете сделать это, перейдя в Файл → Настройки → Настройки. Затем вам нужно нажать на три точки справа, чтобы настроить файл settings.json для текущего пользователя:

Как показано выше, вы затем можете выбрать между gofmt, goformat и goreturns, а затем при необходимости «получить» пакет.

Фрагменты

VSCode уже имеет фрагменты по умолчанию для большинства повторяющихся задач, которые вы выполняете с Go (базовый цикл for, цикл диапазона и т. Д.). Тем не менее, вы можете добавить свои собственные фрагменты или даже переопределить существующие. Для этого вам нужно перейти в Файл → Настройки → Пользовательские фрагменты. Затем вы изменяете файл go.json, показанный в раскрывающемся меню. Образец файла go.json после модификации будет выглядеть следующим образом:

{
    ...
    
    "main boilerplate" : {
        "prefix": "package",
        "body": [
            "package main\n",
            "func main() {",
            "\t$0",
            "}",
        ],
        "description": "Custom snippet for a Go main application"
    },
    "http handlerFunc": {
        "prefix": "func",
        "body": [
            "func $1(w http.ResponseWriter, r *http.Request) {",
            "\t$0",
            "}",
        ],
        "description": "Custom snippet to define a http handler function"
    }
} // EOF

Тесты

Написать тесты с VSCode так же просто, как запустить терминал (Ctrl (или Cmd) + Shift + `) и запустить команду go test в пакет для тестирования. Однако сначала нам нужно написать тесты.

Допустим, у нас есть файл sum.go с этой тривиальной функцией:

package demo
// Sum adds two numbers a and b to produce a sum, c
func Sum(a, b int) (c int) {
    c = a + b
    return
}

Мы могли бы сгенерировать как модульные, так и интеграционные тесты для пакета, используя gotests набор.

go get -u github.com/cweill/gotests/...

Чтобы использовать его, откройте Command Pallete (Ctrl (или Cmd) + Shift + P). Затем введите Go:, вы должны увидеть все команды, доступные в настоящее время с расширением Go. Когда вы выбираете Go: Generate Unit Tests For File, вы должны иметь этот вывод в файле sum_test.go, куда мы затем можем добавить наши тестовые примеры:

package demo
import "testing"
func TestSum(t *testing.T) {
    type args struct {
        a int
        b int
    }
    tests := []struct {
        name  string
        args  args
        wantC int
    }{
        // TODO: Add test cases.
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if gotC := Sum(tt.args.a, tt.args.b); gotC != tt.wantC {
                t.Errorf("Sum() = %v, want %v", gotC, tt.wantC)
            }
        })
    }
}

С другой стороны, моки можно делать с помощью пакета mockery. Мы могли бы создать настраиваемую задачу для автоматического создания макетов. Давайте изменим файл sum.go, добавив в него еще одну тривиальную, но многословную реализацию операции Sum:

package demo
import "math/cmplx"
// Solver performs operations on numbers, natural, real or complex.
// It performs only the Sum operation for now.
type Solver interface {
    Sum() (r, θ float64)
}
// Real represents a real number
type Real struct {
    a float64
    b float64
}
// Complex represents a complex number
type Complex struct {
    a complex128
    b complex128
}
// Sum adds two real numbers a and b to produce a sum, c
func (r *Real) Sum() (c, θ float64) {
    c, θ = r.a+r.b, 0
    return
}
// Sum adds two complex numbers a and b to produce a sum, c
func (cx *Complex) Sum() (c, θ float64) {
    c, θ = cmplx.Polar(cx.a + cx.b)
    return
}

Затем, чтобы автоматически создавать макеты с помощью VSCode, убедитесь, что у вас установлен пакет mockery через:

go get -u github.com/vektra/mockery.../

Затем мы создаем задачу, используя Терминал → Настроить задачи…. Если в настоящее время у вас нет задач для настройки, вам нужно будет создать новую на основе шаблона. Это создает файл tasks.json в папке .vscode вашего рабочего каталога, где вы можете создавать все виды задач. Теперь измените tasks.json, чтобы он выглядел так:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Go Mockery",
            "type": "shell",
            "command": "mockery -all",
        },
        // The next three assumes a main package exists in project or workspace root
        {
            "label": "Go Run",
            "type": "shell",
            "command": "go run .",
            "problemMatcher": [
                "$go"
            ],
        },
        {
            "label": "Go Build",
            "type": "shell",
            "command": "go build .",
"problemMatcher": [
                "$go"
            ],
        },
        {
            "label": "Go Build and Run",
            "type": "shell",
            "command": "go build . && ./${workspaceFolderBasename}",
            "problemMatcher": [
                "$go"
            ],
            "group": {
                 "kind": "build",
                 "isDefault": true
            }
        },
    ]
} // EOF

Обратите внимание, что в образце файла tasks.json я добавил простую задачу для автоматического создания макетов для всех интерфейсов, найденных в проекте. Следующие три задачи: запуск, сборка и сборка и запуск полезны, но не обязательны.

Давайте проверим это, запустив задачу Go Mockery (Терминал → Выполнить задачи…). Затем мы выбираем первый вариант с надписью Продолжить без сканирования вывода задачи. Затем мы должны увидеть макет модели для интерфейса Solver в папке mocks корня проекта. Должно получиться так:

// Code generated by mockery v1.0.0. DO NOT EDIT.
package mocks
import mock "github.com/stretchr/testify/mock"
// Solver is an autogenerated mock type for the Solver type
type Solver struct {
    mock.Mock
}
// Sum provides a mock function with given fields:
func (_m *Solver) Sum() (float64, float64) {
    ret := _m.Called()
    
    var r0 float64
    if rf, ok := ret.Get(0).(func() float64); ok {
        r0 = rf()
    } else {
        r0 = ret.Get(0).(float64)
    }
    var r1 float64
    if rf, ok := ret.Get(1).(func() float64); ok {
        r1 = rf()
    } else {
        r1 = ret.Get(1).(float64)
    }
    return r0, r1
}

Тесты - важная часть написания полезных программ на Go. Таким образом, при правильных тестах может даже не потребоваться отладчик для проверки ошибок.

Заключение

Вот и все! Руководство по использованию VSCode для написания кода Go. Тем не менее, я хотел, чтобы вы повысили продуктивность, даже если это немного.

Спасибо, что зашли.