在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Konstantin8105/Effective_Go_RU开源软件地址:https://github.com/Konstantin8105/Effective_Go_RU开源编程语言:HTML 100.0%开源软件介绍:Effective Go (RU) (Эффективный Go)Оригинал смотри: https://golang.org/doc/effective_go.html
Список дополнительных материалов: Оглавление
ВведениеGo - это новый язык программирования. Хотя, он заимствует идеи из существующих языков, он обладает необычными свойствами, которые позволяют создавать эффективные программы, язык Go отличается по своему характеру от программ, написанных на родственных языках. Прямолинейный перевод C++ или Java программ в Go вряд ли даст удовлетворительный результат, т.к. Java программы написаны на Java, не на Go. С другой стороны, думая о проблеме с точки зрения Go можно добиться успеха, но это уже другая программа. Другими словами, для хорошего написания кода на языке Go, важно понимать его особенности и идиомы. Также важно знать установленные соглашения для программирования на Go, такие как именование, форматирование, разработка программ и так далее, так чтобы программы написанные Вами были простыми для понимания другими программистами Go. Этот документ даёт примеры для написания чистого, идеоматичного кода на Go. Он дополняет спецификацию языка, Тур по Go, и Как писать на Go, каждую из которых необходимо прочитать в первую очередь. ПримерыGo пакеты исходных кодов предназначены не только в качестве основных библиотек, но и в качестве примеров использования языка. Кроме того, многие пакеты имеют работающие, автономные исполняемые примеры и Вы можете запустить напрямую с помощью страницы golang.org, такие как этот (если необходимо, нажмите на слово "Примеры" чтобы открыть их). Если у Вас есть вопрос о том как решить какую-либо проблему или как что-то реализовать, то документация, исходные коды и примеры в библиотеке могут дать ответ, идею или объяснение. ФорматированиеФорматирование является наиболее спорным, но не сильно важным вопросом. Люди могут привыкнуть к различным стилям форматирования, но было бы лучше, если бы этого не приходилось делать и меньше времени придавалось этой теме, если бы все использовали одинаковый стиль. Проблема данной утопии в том, как это сделать без длинного руководства по стилю. В Go мы используем нетипичный подход и передаем машине заботу о форматировании.
Программа К примеру, нет необходимости тратить время на выравнивание комментариев для полей структур, т.к. type T struct {
name string // name of the object
value int // its value
}
type T struct {
name string // name of the object
value int // its value
} Все стандартные пакеты Go отформатированы с помощью Очень коротко о некоторых деталях форматирования: АбзацМы используем табуляцию для абзацев и Длина строкиGo не имеет предела длины строки. Не беспокойтесь о длинных строках. Если строка кажется слишком длинной, прервите ее и добавьте дополнительный отступ (символ табуляции) на новой строке. Круглые скобкиGo нуждается в меньшем количестве круглых скобок, чем C и Java: структуры ветвления, цикла (
не нуждается в добавлении пробелов, в отличии от других языков. КомментарииGo использует C-стиль Программа и веб-сервер - Каждый пакет должен иметь комментарий пакета - это блок комментариев предшествующий объявлению пакета.
Для пакетов состоящих из нескольких файлов, комментарий пакета может быть расположен в любом из файлов, но только в одном из них.
Комментарий пакета должен представлять информацию о пакете в целом.
Он будет отображен вначале страницы /*
Package regexp implements a simple library for regular expressions.
The syntax of the regular expressions accepted is:
regexp:
concatenation { '|' concatenation }
concatenation:
{ closure }
closure:
term [ '*' | '+' | '?' ]
term:
'^'
'$'
'.'
character
'[' [ '^' ] character-ranges ']'
'(' regexp ')'
*/
package regexp Если пакет простой, то комментарий может быть кратким. // Package path implements utility routines for
// manipulating slash-separated filename paths. Дополнительное форматирование, к примеру баннер из * (звездочек), не требуется.
Шрифт для сформированного результата не обязательно будет моноширинный, поэтому не полагайтесь на пробелы при выравнивании, В зависимости от контекста, Любые комментарии внутри пакета, предшествующие объявлению, используются как описание этого объявления. Каждый экспортируемый объект, название которого начинается с большой буквы, должен иметь комментарий. Лучше всего использовать комментарии в виде полных предложений. Это позволяет производить их автоматическую обработку. Первое предложение должно быть ключевым и начинаться с имени объявления. // Compile parses a regular expression and returns, if successful,
// a Regexp that can be used to match against text.
func Compile(str string) (*Regexp, error) { Если комментарий начинается с имени, то $ godoc regexp | grep -i parse Если все комментарии в пакете начинаются с "This function...", $ godoc regexp | grep parse
Compile parses a regular expression and returns, if successful, a Regexp
parsed. It simplifies safe initialization of global variables holding
cannot be parsed. It simplifies safe initialization of global variables
$ Синтаксис Go допускает групповое объявление. Для каждой группы констант или переменных может быть представлен один общий комментарий. Однако такое объявление выглядит небрежно. // Error codes returned by failures to parse an expression.
var (
ErrInternal = errors.New("regexp: internal error")
ErrUnmatchedLpar = errors.New("regexp: unmatched '('")
ErrUnmatchedRpar = errors.New("regexp: unmatched ')'")
...
) Группировка также может показать взаимосвязи между элементами, к примеру, группа переменных защищенных mutex: var (
countLock sync.Mutex
inputCount uint32
outputCount uint32
errorCount uint32
) ИменованиеИменование очень важно в Go, как и в других языках. Они имеют семантический эффект: Видимость имени за пределами пакета, определяется по первой букве имени, которая, если является заглавной, то имя будет видно вне это пакета. Именно поэтому стоит уделить время обсуждению соглашения об именовании в программах Go. Именование пакетовКогда пакет импортируется, имя пакета используется для доступа к его содержимому. После того, как пакет импортирован, import "bytes" можно использовать Согласно другому соглашению, имя пакета является базовым именем его исходного каталога; пакет Импортирующий пакет будет использовать имя пакета для обозначения его содержимого, поэтому при экспорте может учитываться этот факт, чтобы избежать повторения.
(Не используйте Более того, т.к. импортируемые объекты адресуются по имени пакета, следовательно Другой короткий пример функция ГеттерыGo не предоставляет автоматическую поддержку геттеров и сеттеров.
Но не будет ошибкой создание геттеров и сеттеров самостоятельно, и если это необходимо, то делайте так, но идиоматически нет необходимости добавлять owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
} Имена интерфейсовПо соглашению, интерфейсы с одним методом должны называться как метод с суффиксом Существует целый ряд имен, которыe соблюдают это соглашение и содержат подобные методы. MixedCapsВ заключении, Go соглашение использует Точка с запятойКак и в С, грамматика Go формально использует точку с запятой для разделения операций-выражений (инструкций), но в отличии от C, точка с запятой не представлена в исходном коде. Вместо этого, лексер использует простое правило добавления точки с запятой автоматически, при сканировани. Таким образом текст на входе по большей части освобожден от них. Правило такое. Если последний токен(лексема) перед символом новой строки - идентификатор (который включает такие слова, как break continue fallthrough return ++ -- ) } то, лексер всегда добавляет точку с запятой после него. Вкратце, это может звучать так: "Если новая строка начинается после токена, который может закрывать операцию-выражение, то добавить точку с запятой". Точка с запятой также может быть опущена сразу перед закрывающей скобкой, таким образом для операции-выражения такой как: go func() { for { dst <- <-src } }() точка с запятой не требуется. Как следствие из правила, вы не можете перенести открывающую скобку управляющих
структур ( if i < f() {
g()
} но не так if i < f() // ошибка!
{ // ошибка!
g()
} Управляющие структурыУправляющие структуры в Go аналогичны тем же структурам в C, но имеют ряд важных отличий. Во-первых нет циклов IfВ Go простой if x > 0 {
return y
} Обязательные фигурные скобки упрощают написание простых условий Поскольку if err := file.Chmod(0664); err != nil {
log.Print(err)
return err
} В библиотеках Go, вы найдёте подобную запись, если f, err := os.Open(name)
if err != nil {
return err
}
codeUsing(f) В данном примере представлена общая схема, где код защищен от серии ошибок. Код читается хорошо, если выполняется без ошибок, обходя случаи их возникновения. Так как ошибки приводят к завершению выполнения блока с помощью f, err := os.Open(name)
if err != nil {
return err
}
d, err := f.Stat()
if err != nil {
f.Close()
return err
}
codeUsing(f, d) Переопределение и переприсваиваниеПоследний пример предыдущего раздела демонстрирует использование краткой формы объявления переменных f, err := os.Open(name) Несколькими строками ниже вызывается d, err := f.Stat() который выглядит как объявления двух переменных В объявлении
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论