Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Введение в google Go 
:(
    Опции темы
GrayCardinal
Дата 6.1.2010, 16:21 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



               Язык google "Go"
Go - новый мощнейший, экспериментальный, низкоуровневый язык программирования от Google. 
Адрес проекта:
http://golang.org

Мои простые примеры, которые демонстрируют основные возможности языка.
http://op.oaoontk.ru/GO/samples.tar.gz


            Установка.
Настройка среды. Рекомендую такие значения:
Код


export GOROOT=/usr/src/golang
export GOARCH=386
export GOOS=linux
export GOBIN=/usr/src/gobin
export PATH=$PATH:/usr/src/gobin


Сохраните эти переменные в файл и подгружайте с помощью "source" или "."
$ source /usr/src/golang/env.sh

Здесь GOROOT - каталог с сырцами (см ниже). GOBIN - каталог для исполняемых файлов Go. 
Изначально вы должны создать пустой каталог (RW) под испоняемые файлы. После сборки
из сырцов там будут лежать все необходимые программы (в том числе компилер 8g и линкер 8l)

Получить сырцы Go можно либо с помощью mercurial

Код

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT

либо скачав последний снапшот с моего сайта:
http://op.oaoontk.ru/golang.tar.gz
В моем архиве уже есть ./env.sh. 
Сырцы распаковываем (если из архива) и пихаем в $GOROOT (/usr/src/golang)

Далее - сборка. 
ПРИМЕЧАНИЕ: перед сборкой все вышеописанные переменные должны быть установлены.
Заходим в $GOROOT/src и выполняем 
Код

$ make all

            Введение.
Почему Go ? Хочу отметить некоторые моменты, которые меня прельстили в этом языке (по сравнению с Си)
1. Нет хидеров. Вообще.
2. Быстрая компиляция. Это не шутка. Компиляция просто РЕАКТИВНАЯ.
3. Функции могут возвращать несколько значений.
4. Автоматическая сборка мусора.
5. Интерфейсы.
6. defer'ы
...

Вообще, по моему скромному мнению язык стоит изучить хотя бы для того, чтобы иметь представление 
об этом перспективном языке... Если после этого захотите вернуться к Си, никто Вам мешать не будет.

            
            Первая программа.
Хело ворлд, конечно... 

Код

package main

import fmt "fmt" // Package implementing formatted I/O.

func main() { 
    fmt.Println("Hello, world !") 


(обратите внимание на отсутствие точек с запятой)

Сохраним код в файл, допустим, 1.go Теперь его надо откомпилировать и слинковать.
Код

$ 8g 1.go
$ 8l 1.8
$ ./8.out
-> Hello world !


На моей паге аналогичная Си-программа компилировалась в 5 раз (!) дольше. К сожалению, на момент написания статьи,
нет возможности слинковать бинарник с шаровым go. Бинарник получается большой, но без всяких зависимостей. Т.е.
Код

$ ldd 8.out
->         statically linked

           
           Встроенные типы.
Я не буду перечислять все "простые" типы Go, просто посмотрите табличку вот здесь:
http://golang.org/doc/go_spec.html#Types
Массивы, слайсы,етк. разжую чуть позже...

            Переменные.
В Go все переменные строго типизированные. Переменные (в том числе массивы и слайсы) автоматически "обнуляются". 
Для определения переменной можно использовать два подхода. Первый - с помощью var:
Код

var varname Type

Второй - при помощи :=, к примеру так:
Код

varname := new(Type)

В Go есть указатели, однако отсутствует любая арифметика с ними. Еще одна особенность - нет "->". Точка используется
точно так же для указателей.

            Операторы.
Присутствуют if,for,switch. Из особенностей - отсутствие круглых скобок и автопреобразования в bool

Код

var i int
switch i { // OK
    case 0:
        fmt.Println("Ноль")
}

if i == 0 { // OK
}

if i {    // Error
}


отмечу, что отсутствует "while"

            Область видимости.
Для того, чтобы функция/тип/интерфейс был виден за пределами пакета, его имя должно начинаться с заглавной буквы.
Так же поля структуры, не с заглавной - будут недоступны "извне". А ля private.

            Типы.
Вы можете (и будете) определять типы. Вообще типы в Go имеют очень специфическое значение. Вот небольшой пример.
Код

package mailn

type MyType uint32     // Определить новый тип 

func main() {
    var p *MyType
    var i uint32
    p = new(MyType)
    i = *p // error
}


компиляция выдаст следующее:
Код

->./2.go:8: i declared and not used
->./2.go:10: cannot use *p (type MyType) as type uint32 in assignment

Первая ошибка - мы определили, но не использовали переменную. Да, это ошибка а не предупреждение как в Си.
Вторая строчка интересней. В ней говорится что _нельзя_ приравнивать MyType к uint32 ибо это _разные_ типы.
Так же при помощи type вы будете определять структуры и интерфейсы. Структура, она и в африке структура,
а интерфейсы рассмотрим чуть позже. Вот определение простого типа-структуры:
Код

type Mytype struct {
    a,b uint32
}        

 
                  Массивы.
Вот как определить массив:
Код

var varname [SIZE]type

- определить переменную-массив SIZE элементов типа type. В данном случае память выделится и "обнулится" автоматически.
Добавлю что SIZE не может быть переменной ! Если вы не знаете заранее размер массива, то вам нужны слайсы.
Если у вас указатель на массив, память можно выделить при помощи new (но не "make" !)
Код

buf *[100]int
buf = new([100]int)


        Слайсы.
По сути это тот же массив. Точнее ссылка на него. 
Определение слайса:
Код

var buf []type
buf = make([]type, SIZE)


(SIZE может быть как константой, так и переменной)
Т.е. вся разница в том, что размер не указывается, да память надо выделить вручную. Память для слайса выделяется при
помощи make (однако обнуляется так же автоматически).
Размер массива и слайса можно определить при помощи встроенной функции len.

        Хеш
Хеш, в данном контексте - привязка одного к другому. Все довольно просто.
Код

my_hash = make(map[string]string)
// my_hash - хеш.с привязкой строка-строка. Установить значение можно так:
my_hash["key"] = value
// Удалить ключ:
my_hash["key"] = 0, false


        range
Оператор "range" может быть использован совместно с массивами,слайсами,чанами (channels), хешами. Вроде ничего не забыл.
Использовать довольно просто:

Код

var buf [128]byte
for index,value := range buf {
    fmt.Printf ("%d %d\n", index, value)    
}    


        new или make ?
Для создания слайсов,хешей,чанов (channels) используется make. В остальных случаях - new.

        Функции.
В Go функции:
1. Имеют "привязку" к типу.
2. Могут возвращать несколько значений.

Рассмотрим на примере одной функции.
Код

    func (c *UDPConn) Read(b []byte) (n int, err os.Error)

c - привязка к типу. b - обязательный параметр (слайс) n - первое возвращаемое значение, err - второе. Чтобы использовать
данную функцию, нужна переменная типа *UDPConn. Её, к примеру, можно получить вызвав одну из соотв. функций пакета "net"
Условный пример 
Код

package main

import net "net"
 
func main() {
    var c *net.UDPConn
    var buf []byte
    buf = make([]byte,4096)
    c,_ = net.DialUDP(...)
    c.Read(buf)    
}


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
Код

type Reader interface {
    Read(p []byte) (n int, err os.Error)
}

Описанная здесь функция Read реализована для многих типов. В том числе файлы и "bytes". Т.е. они поддерживают интерфейс io.Reader. Замечу,
что явно указывать какой интерфейс поддерживает данный тип вовсе необязательно. Просто реализуйте все функции интерфейса. Рассмотрим 
некоторые функции пакета bufio

Код

    func NewReader(rd io.Reader) *Reader

Функция требует один параметр - переменную для типа которой реализован интерфейс io.Reader. Это могут быть файлы, сокеты етк. Так же любой
 Ваш тип, для которого определена функция Read.

Код

    func NewWriter(wr io.Writer) *Writer

Аналогично, но для типа переменной wr должен быть реализован интерфейс io.Writer, т.е. функция Write.

Интерфейсы так же используются для переменных тип которых заранее неизвестен. Рассмотрим пакет list. Т.е. список. Вот демка использования
List. Использую List, ибо некоторые моменты его использования вовсе не очевидны, и не документированы.

Код

package main

import list "container/list"
import "fmt"
 
func main() {
   var m_list *list.List
   var str,str2 string;
   var m_element *list.Element

   m_list = list.New()
   str = "some text"
   m_list.PushBack (str)
   m_element = m_list.Front()
   str2 = m_element.Value.(string)
   fmt.Println(str2)
}

строки 1-6 думаю понятны.
7 - Объявляем указатель на объект List.
8 - нам нужны две строки
9 - и переменная типа *list.Element
11 - Создаем новый объект типа List.
12-13 - добавляем строку в конец списка.
рассмотрим более детально функцию PushBack

func (l *List) PushBack(value interface{}) *Element {
Функция для типа "указатель на List". Параметр value должен отвечать интерфейсу... пустом интерфейсу. Т.е. можете пихать переменные любого 
типа, без всякого преобразования.  Дальше интереснее. 
14 - берем первый элемент списка.
15. Извлекаем значение из элемента списка. Элемент имеет следующую структуру:
Код

type Element struct {
    Value interface{}
}

Как видно, значение имеет тип, поддерживающий пустой интерфейс. Любой тип. Однако здесь необходимо обратное преобразование. Для
такого преобразования просто добавляется .(нужный тип). В данном случае это .(string).
16. Вывод исходной строки.

        defer'ы
defer'ы, определяют функции, которые будут выполнены по завершению данной функции. Приведу простой пример, взятый из GoCourse
Код

func data(name string) string {
    f := os.Open(name, os.O_RDONLY, 0)
    defer f.close ()
    contents := io.ReadAll(f)
    return contents
}


        Goroutines
Если в Си эквиваленте - просто треды. Новый тред запускается при помощи оператора "go". Просто запустить "go" с одним параметром -
функцией. Она будет выполнятся в новом треде, вплоть до завершения. Как управлять goroutine'ами, пока не понятно. 
Код

func routine () {
}
...
go routine ()

Стоит отметить, что goroutine изначально имеет минимальный стек и сама расширяет его по мере необходимости.

        Channels (чаны).
Пусть будут чанами. Чаны - средство передачи данных между потоками (goroutines). Ежели по "Си" - просто труба. На самом деле 
чаны имеют гораздо большую функциональность. 
Код

var all chan int
var recv_only <-chan int
var send_only chan<- int
all = make(chan int, [size])
recv_only = make(<-chan int, [size])
send_only = make(chan<- int, [size])

1 - чан в обе стороны
2 - чан только для чтения
3 - чан только для записи


Это сообщение отредактировал(а) GrayCardinal - 13.1.2010, 15:35


--------------------
PM MAIL WWW   Вверх
Фантом
Дата 6.1.2010, 16:37 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1515
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Короче говоря, чуток видоизмененный Паскаль (в его современном виде) с наполовину C-подобным синтаксисом.  smile 
PM   Вверх
bilbobagginz
Дата 6.1.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



GrayCardinal, на хомяке проекта (кстати символ языка какой-то грызун... хомяк наверное)
есть упоминание о каких-то свойствах языка Go, делающим его удобным в параллельном программировании.
Можешь привести пример кода, который напр. распараллеливает что-то там... я не знаю ?

P.S.:
и еще выдели код под синтакс Java, по-моему прокатит, а команды и скрипты подкрась синтаксис по языку Perl.


Это сообщение отредактировал(а) bilbobagginz - 6.1.2010, 16:41


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 6.1.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



bilbobagginz
С кодом проблемы... Вроде был какой-то недосервак... 
Я тут cp на Go перевел. Теперь работает в два раза дольше  smile 


--------------------
PM MAIL WWW   Вверх
Wisdom
Дата 6.1.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



Похоже, что в лаборатории безумного гения скрестили C с Паскалем, полученное "нечто" кастрировали в синтаксисе, добавили некоторых "неведомых примочек" и получили новый язык.. 
Цитата

Почему Go ? Хочу отметить некоторые моменты, которые меня прельстили в этом языке (по сравнению с Си)
1. Нет хидеров. Вообще.

Сомнительное преимущество. ВЧем же вас хэдэры не устраивают?
Цитата

Быстрая компиляция. Это не шутка. Компиляция просто РЕАКТИВНАЯ.

Хотелось бы узнать, за счет чего такая "реактивная" компиляция достигается?
Цитата

3. Функции могут возвращать несколько значений.

Ну, ребят.. круто конечно, но надо ли?  smile 
Цитата

4. Автоматическая сборка мусора.

 smile 
Цитата

5. Интерфейсы.

Эм..
**************************
1. Отсутствие круглых скобок в switch затрудняет чтение кода.
2. Пример с определением типов очень остроумен, конечно.. И ошибка в GO является, конечно же, несомненным преимуществом перед предупреждением в С :\
3. Пространство имен. Регистрозависимый функционал, это, конечно, круто.. опять же, зачем?
4. Объявление массивов без комментариев.
Ладно.. пожалуй не буду зудеть smile Описать язык в двух словах, конечно, трудно.
Возникло желание рассмотреть поближе, но по ссылке на адрес проекта нечаво нет оО

PM MAIL   Вверх
GrayCardinal
Дата 6.1.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



Wisdom
Прошу не пинать меня за язык, у меня только статья, не более smile


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 6.1.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



у меня make all вылетает с ошибкой
Код

bash /home/rei3er/install/go/golang/src/make.bash
bash: /home/rei3er/install/go/golang/src/make.bash: No such file or directory
make: *** [build] Error 127

никакого make.bash нет в $GOROOT/src


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bilbobagginz
Дата 6.1.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(Wisdom @  6.1.2010,  16:53 Найти цитируемый пост)
Возникло желание рассмотреть поближе, но по ссылке на адрес проекта нечаво нет оО

что значит нечаво нет?!?!
код, дока, хауту, книги... нечаво нет.
Цитата(Wisdom @  6.1.2010,  16:53 Найти цитируемый пост)
Хотелось бы узнать, за счет чего такая "реактивная" компиляция достигается?

на сайт, где ничего нет - марш smile



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
powerfox
Дата 6.1.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(Wisdom @  6.1.2010,  18:53 Найти цитируемый пост)
Сомнительное преимущество. ВЧем же вас хэдэры не устраивают?

Это из области «почему заголовочные файлы не обеспечивают модульность».

Цитата(bilbobagginz @  6.1.2010,  17:39 Найти цитируемый пост)
есть упоминание о каких-то свойствах языка Go, делающим его удобным в параллельном программировании.

Судя по описанию, так это вообще основная фишка языка.
GrayCardinal, дуй дописывать примеры smile




--------------------
user posted image
PM WWW   Вверх
kosmonaFFFt
Дата 6.1.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Красноярск

Репутация: нет
Всего: 5



Хм... ИМХО в параллельном программировании более удобен был бы erlang smile
Лично мне не нравится отсутствие скобок в if/switch и местами очень паскалеподобный синтаксис...
Да и с областью видимости, которая зависит от регистра первой буквы тоже не очень придумали...

З.Ы. Чуть не забыл - если язык завоюет какую-нибудь популярность, под него еще придется ждать приличную IDE...

Это сообщение отредактировал(а) kosmonaFFFt - 6.1.2010, 22:17


--------------------
user posted image
PM MAIL ICQ Jabber   Вверх
GrayCardinal
Дата 7.1.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



powerfox
Не, сначала бобика доделаю  smile

Добавлено через 14 минут и 32 секунды
kosmonaFFFt
подсветка для Vim уже есть smile


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 7.1.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



Как юзать "основную фишку", разберусь, отпишусь чуть позже.


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 7.1.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58





--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 8.1.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



не совсем понятно, как выделяется память в Go для объектов, к примеру такой код
Код

package main

import "fmt"

func main() {
    v1 := 1
    v2 := new(int)
    fmt.Printf("%p, %p\n", &v1, v2)
}

выдает
0x7EFF01CD1010, 0x7EFF01CD1018
что явно соответствует выделению памяти для v1 и v2 на стеке, хотя по идее new должен работать с brk/mmap хипом


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 13.1.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3024
Регистрация: 9.11.2003

Репутация: 4
Всего: 58



Мдя. Похоже придется долго и упорно объяснять разработчикам что же они сделали  smile 

Это сообщение отредактировал(а) GrayCardinal - 13.1.2010, 14:03


--------------------
PM MAIL WWW   Вверх
Google
  Дата 22.9.2017, 14:32 (ссылка)  





  Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Добро пожаловать в раздел "Другие языки" форума Vingrad!

Void
Void

Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)

  • Обязательно следуйте правилам Форума.
  • Пожалуйста, прочитайте и следуйте рекомендациям по работе в разделе и навигации по Форуму.
  • Для вставки текстов исходных кодов используйте подсветку синтаксиса из выплывающего списка Код в форме ответа. Если Ваш язык в списке не представлен, то используйте тег: [code=ваш_язык]код[/code], например, [code=ada]код[/code]. Если в будущем подсветка синтаксиса для указанного языка будет реализована, исходный код преобразится.
  • Помните, один вопрос - одна тема.

Приятного времяпрепровождения! С уважением, Void, kemiisto .

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие языки | Следующая тема »


 




[ Время генерации скрипта: 0.1542 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.