Ответ 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, я настоятельно рекомендую прочитать спецификацию языка. Он довольно короткий и очень четко написан. Это очистит много этих маленьких особенностей для вас.