|
|
|
GrayCardinal |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
Язык google "Go"
Go - новый мощнейший, экспериментальный, низкоуровневый язык программирования от Google. Адрес проекта: http://golang.org Мои простые примеры, которые демонстрируют основные возможности языка. http://op.oaoontk.ru/GO/samples.tar.gz Установка. Настройка среды. Рекомендую такие значения:
Сохраните эти переменные в файл и подгружайте с помощью "source" или "." $ source /usr/src/golang/env.sh Здесь GOROOT - каталог с сырцами (см ниже). GOBIN - каталог для исполняемых файлов Go. Изначально вы должны создать пустой каталог (RW) под испоняемые файлы. После сборки из сырцов там будут лежать все необходимые программы (в том числе компилер 8g и линкер 8l) Получить сырцы Go можно либо с помощью mercurial
либо скачав последний снапшот с моего сайта: http://op.oaoontk.ru/golang.tar.gz В моем архиве уже есть ./env.sh. Сырцы распаковываем (если из архива) и пихаем в $GOROOT (/usr/src/golang) Далее - сборка. ПРИМЕЧАНИЕ: перед сборкой все вышеописанные переменные должны быть установлены. Заходим в $GOROOT/src и выполняем
Введение. Почему Go ? Хочу отметить некоторые моменты, которые меня прельстили в этом языке (по сравнению с Си) 1. Нет хидеров. Вообще. 2. Быстрая компиляция. Это не шутка. Компиляция просто РЕАКТИВНАЯ. 3. Функции могут возвращать несколько значений. 4. Автоматическая сборка мусора. 5. Интерфейсы. 6. defer'ы ... Вообще, по моему скромному мнению язык стоит изучить хотя бы для того, чтобы иметь представление об этом перспективном языке... Если после этого захотите вернуться к Си, никто Вам мешать не будет. Первая программа. Хело ворлд, конечно...
(обратите внимание на отсутствие точек с запятой) Сохраним код в файл, допустим, 1.go Теперь его надо откомпилировать и слинковать.
На моей паге аналогичная Си-программа компилировалась в 5 раз (!) дольше. К сожалению, на момент написания статьи, нет возможности слинковать бинарник с шаровым go. Бинарник получается большой, но без всяких зависимостей. Т.е.
Встроенные типы. Я не буду перечислять все "простые" типы Go, просто посмотрите табличку вот здесь: http://golang.org/doc/go_spec.html#Types Массивы, слайсы,етк. разжую чуть позже... Переменные. В Go все переменные строго типизированные. Переменные (в том числе массивы и слайсы) автоматически "обнуляются". Для определения переменной можно использовать два подхода. Первый - с помощью var:
Второй - при помощи :=, к примеру так:
В Go есть указатели, однако отсутствует любая арифметика с ними. Еще одна особенность - нет "->". Точка используется точно так же для указателей. Операторы. Присутствуют if,for,switch. Из особенностей - отсутствие круглых скобок и автопреобразования в bool
отмечу, что отсутствует "while" Область видимости. Для того, чтобы функция/тип/интерфейс был виден за пределами пакета, его имя должно начинаться с заглавной буквы. Так же поля структуры, не с заглавной - будут недоступны "извне". А ля private. Типы. Вы можете (и будете) определять типы. Вообще типы в Go имеют очень специфическое значение. Вот небольшой пример.
компиляция выдаст следующее:
Первая ошибка - мы определили, но не использовали переменную. Да, это ошибка а не предупреждение как в Си. Вторая строчка интересней. В ней говорится что _нельзя_ приравнивать MyType к uint32 ибо это _разные_ типы. Так же при помощи type вы будете определять структуры и интерфейсы. Структура, она и в африке структура, а интерфейсы рассмотрим чуть позже. Вот определение простого типа-структуры:
Массивы. Вот как определить массив:
- определить переменную-массив SIZE элементов типа type. В данном случае память выделится и "обнулится" автоматически. Добавлю что SIZE не может быть переменной ! Если вы не знаете заранее размер массива, то вам нужны слайсы. Если у вас указатель на массив, память можно выделить при помощи new (но не "make" !)
Слайсы. По сути это тот же массив. Точнее ссылка на него. Определение слайса:
(SIZE может быть как константой, так и переменной) Т.е. вся разница в том, что размер не указывается, да память надо выделить вручную. Память для слайса выделяется при помощи make (однако обнуляется так же автоматически). Размер массива и слайса можно определить при помощи встроенной функции len. Хеш Хеш, в данном контексте - привязка одного к другому. Все довольно просто.
range Оператор "range" может быть использован совместно с массивами,слайсами,чанами (channels), хешами. Вроде ничего не забыл. Использовать довольно просто:
new или make ? Для создания слайсов,хешей,чанов (channels) используется make. В остальных случаях - new. Функции. В Go функции: 1. Имеют "привязку" к типу. 2. Могут возвращать несколько значений. Рассмотрим на примере одной функции.
c - привязка к типу. b - обязательный параметр (слайс) n - первое возвращаемое значение, err - второе. Чтобы использовать данную функцию, нужна переменная типа *UDPConn. Её, к примеру, можно получить вызвав одну из соотв. функций пакета "net" Условный пример
1 - Определяем новый пакет main. 3 - Подгружаем модуль "net", который будет известен как net. Здесь стоит отметить, что никакие имена из модуля НЕ подгружаются. Везде, где вы ссылаетесь на что-то из пакета, вы должны приписывать имя модуля. 5 Точка входа любой Go-программы. Без аргументов. Если нужны аргументы - стоит копнуть модуль "flag". 6 - определяем переменную-указатель на UDPConn, для дальнейшего использования. . 7-8 создаем буфер-слайс для последующего чтения. Обычный буфер, 4096 байт. 9 Получаем инициализированную переменную типа *UDPConn. Однако функция net.DialUDP возвращает два значения, второе нам, положим, сейчас не нужно, заменяем ненужное символом подчеркивания. Если этого не сделать - получим ошибку при компиляции. 10 Выполняем функцию Read типа UDPConn для переменной "c" c передачей одного значения. Почему без размера ? Размер массива/слайса всегда можно узнать при помощи len, в данном случае - len(buf) Всё это позволяет вам забыть слово "class", но не отказываться от ООП. Интерфейсы. Интерфейсы - одна из вкусностей языка, которую нужно детальнейше изучить. Интерфейс - суть определение некоторых функций, которые может поддерживать некоторый тип. Чтобы тип отвечал интерфейсу, он должен реализовывать все функции этого интерфейса. Рассмотрим интерфейс io.Reader
Описанная здесь функция Read реализована для многих типов. В том числе файлы и "bytes". Т.е. они поддерживают интерфейс io.Reader. Замечу, что явно указывать какой интерфейс поддерживает данный тип вовсе необязательно. Просто реализуйте все функции интерфейса. Рассмотрим некоторые функции пакета bufio
Функция требует один параметр - переменную для типа которой реализован интерфейс io.Reader. Это могут быть файлы, сокеты етк. Так же любой Ваш тип, для которого определена функция Read.
Аналогично, но для типа переменной wr должен быть реализован интерфейс io.Writer, т.е. функция Write. Интерфейсы так же используются для переменных тип которых заранее неизвестен. Рассмотрим пакет list. Т.е. список. Вот демка использования List. Использую List, ибо некоторые моменты его использования вовсе не очевидны, и не документированы.
строки 1-6 думаю понятны. 7 - Объявляем указатель на объект List. 8 - нам нужны две строки 9 - и переменная типа *list.Element 11 - Создаем новый объект типа List. 12-13 - добавляем строку в конец списка. рассмотрим более детально функцию PushBack func (l *List) PushBack(value interface{}) *Element { Функция для типа "указатель на List". Параметр value должен отвечать интерфейсу... пустом интерфейсу. Т.е. можете пихать переменные любого типа, без всякого преобразования. Дальше интереснее. 14 - берем первый элемент списка. 15. Извлекаем значение из элемента списка. Элемент имеет следующую структуру:
Как видно, значение имеет тип, поддерживающий пустой интерфейс. Любой тип. Однако здесь необходимо обратное преобразование. Для такого преобразования просто добавляется .(нужный тип). В данном случае это .(string). 16. Вывод исходной строки. defer'ы defer'ы, определяют функции, которые будут выполнены по завершению данной функции. Приведу простой пример, взятый из GoCourse
Goroutines Если в Си эквиваленте - просто треды. Новый тред запускается при помощи оператора "go". Просто запустить "go" с одним параметром - функцией. Она будет выполнятся в новом треде, вплоть до завершения. Как управлять goroutine'ами, пока не понятно.
Стоит отметить, что goroutine изначально имеет минимальный стек и сама расширяет его по мере необходимости. Channels (чаны). Пусть будут чанами. Чаны - средство передачи данных между потоками (goroutines). Ежели по "Си" - просто труба. На самом деле чаны имеют гораздо большую функциональность.
1 - чан в обе стороны 2 - чан только для чтения 3 - чан только для записи Это сообщение отредактировал(а) GrayCardinal - 13.1.2010, 15:35 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Короче говоря, чуток видоизмененный Паскаль (в его современном виде) с наполовину C-подобным синтаксисом.
|
|||
|
||||
bilbobagginz |
|
|||
Naughtius Maximus Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
GrayCardinal, на хомяке проекта (кстати символ языка какой-то грызун... хомяк наверное)
есть упоминание о каких-то свойствах языка Go, делающим его удобным в параллельном программировании. Можешь привести пример кода, который напр. распараллеливает что-то там... я не знаю ? P.S.: и еще выдели код под синтакс Java, по-моему прокатит, а команды и скрипты подкрась синтаксис по языку Perl. Это сообщение отредактировал(а) bilbobagginz - 6.1.2010, 16:41 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
bilbobagginz,
С кодом проблемы... Вроде был какой-то недосервак... Я тут cp на Go перевел. Теперь работает в два раза дольше |
|||
|
||||
Wisdom |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 12.9.2008 Репутация: нет Всего: нет |
Похоже, что в лаборатории безумного гения скрестили C с Паскалем, полученное "нечто" кастрировали в синтаксисе, добавили некоторых "неведомых примочек" и получили новый язык..
Сомнительное преимущество. ВЧем же вас хэдэры не устраивают?
Хотелось бы узнать, за счет чего такая "реактивная" компиляция достигается?
Ну, ребят.. круто конечно, но надо ли?
Эм.. ************************** 1. Отсутствие круглых скобок в switch затрудняет чтение кода. 2. Пример с определением типов очень остроумен, конечно.. И ошибка в GO является, конечно же, несомненным преимуществом перед предупреждением в С :\ 3. Пространство имен. Регистрозависимый функционал, это, конечно, круто.. опять же, зачем? 4. Объявление массивов без комментариев. Ладно.. пожалуй не буду зудеть Описать язык в двух словах, конечно, трудно. Возникло желание рассмотреть поближе, но по ссылке на адрес проекта нечаво нет оО |
||||||||||
|
|||||||||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
Wisdom,
Прошу не пинать меня за язык, у меня только статья, не более |
|||
|
||||
MAKCim |
|
|||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
у меня make all вылетает с ошибкой
никакого make.bash нет в $GOROOT/src -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bilbobagginz |
|
||||
Naughtius Maximus Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
что значит нечаво нет?!?! код, дока, хауту, книги... нечаво нет.
на сайт, где ничего нет - марш -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
powerfox |
|
|||
I wanna fork() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: нет Всего: 97 |
Это из области «почему заголовочные файлы не обеспечивают модульность».
Судя по описанию, так это вообще основная фишка языка. GrayCardinal, дуй дописывать примеры |
|||
|
||||
kosmonaFFFt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Хм... ИМХО в параллельном программировании более удобен был бы erlang
Лично мне не нравится отсутствие скобок в if/switch и местами очень паскалеподобный синтаксис... Да и с областью видимости, которая зависит от регистра первой буквы тоже не очень придумали... З.Ы. Чуть не забыл - если язык завоюет какую-нибудь популярность, под него еще придется ждать приличную IDE... Это сообщение отредактировал(а) kosmonaFFFt - 6.1.2010, 22:17 -------------------- |
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
powerfox,
Не, сначала бобика доделаю Добавлено через 14 минут и 32 секунды kosmonaFFFt, подсветка для Vim уже есть |
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
Как юзать "основную фишку", разберусь, отпишусь чуть позже.
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
||||
|
||||
MAKCim |
|
|||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
не совсем понятно, как выделяется память в Go для объектов, к примеру такой код
выдает 0x7EFF01CD1010, 0x7EFF01CD1018 что явно соответствует выделению памяти для v1 и v2 на стеке, хотя по идее new должен работать с brk/mmap хипом -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 4 Всего: 58 |
Мдя. Похоже придется долго и упорно объяснять разработчикам что же они сделали
Это сообщение отредактировал(а) GrayCardinal - 13.1.2010, 14:03 |
|||
|
||||
Добро пожаловать в раздел "Другие языки" форума Vingrad! | |
|
Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)
Приятного времяпрепровождения! С уважением, Void, kemiisto . |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Другие языки | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |