Подтвердить что ты не робот

Инициализировать массив структур в Go

Я новичок в Go. Эта проблема сводит меня с ума. Как вы инициализируете массив структур в Go?

type opt struct {
    shortnm      char
    longnm, help string
    needArg      bool
}

const basename_opts []opt { 
        opt {
            shortnm: 'a', 
            longnm: "multiple", 
            needArg: false, 
            help: "Usage for a"}
        },
        opt {
            shortnm: 'b', 
            longnm: "b-option", 
            needArg: false, 
            help: "Usage for b"}
    }

Компилятор сказал, что ожидает ';' после [] opt.

Где я должен поместить скобки '{' для инициализации моего массива struct?

Спасибо

4b9b3361

Ответ 1

Похоже, вы пытаетесь использовать (почти) прямо код C здесь. Go имеет несколько отличий.

  • Во-первых, вы не можете инициализировать массивы и фрагменты как const. Термин const имеет другое значение в Go, как и в C. Список должен быть определен как var.
  • Во-вторых, в качестве правила стиля Go предпочитает basenameOpts в отличие от basename_opts.
  • В Go нет типа char. Вероятно, вы хотите byte (или rune, если вы хотите разрешить кодовые страницы unicode).
  • В объявлении списка должен быть оператор присваивания в этом случае. Например: var x = foo.
  • В парсере Go требуется, чтобы каждый элемент в объявлении списка заканчивался запятой. Это включает в себя последний элемент. Причина этого заключается в том, что Go автоматически вставляет полуколоны, где это необходимо. И для этого требуется более строгий синтаксис.

Например:

type opt struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}

var basenameOpts = []opt { 
    opt {
        shortnm: 'a', 
        longnm: "multiple", 
        needArg: false, 
        help: "Usage for a",
    },
    opt {
        shortnm: 'b', 
        longnm: "b-option", 
        needArg: false, 
        help: "Usage for b",
    },
}

Альтернативой является объявление списка с его типом, а затем использование функции init, чтобы заполнить его. Это в основном полезно, если вы собираетесь использовать значения, возвращаемые функциями в структуре данных. init функции запускаются, когда программа инициализируется и гарантированно заканчивается до выполнения main. Вы можете иметь несколько функций init в пакете или даже в том же исходном файле.

type opt struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}

var basenameOpts []opt

func init() { 
    basenameOpts = []opt{
        opt {
            shortnm: 'a', 
            longnm: "multiple", 
            needArg: false, 
            help: "Usage for a",
        },
        opt {
            shortnm: 'b', 
            longnm: "b-option", 
            needArg: false, 
           help: "Usage for b",
        },
    )
}

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

Ответ 2

Добавление этого как дополнение к превосходному ответу @jimt:

один общий способ определить его во время инициализации - использовать анонимную структуру:

var opts = []struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}{
    {'a', "multiple", "Usage for a", false},
    {
        shortnm: 'b',
        longnm:  "b-option",
        needArg: false,
        help:    "Usage for b",
    },
}

Это обычно используется для тестирования, а также для определения нескольких тестовых примеров и их прокрутки.