LinuxForum.Fans
Тема

язык программирования Go

Автор: Olej 14 сообщений 1965 просмотров
21.01.2017 18:46 #419209


TIOBE награждает язык программирования, который приобрел наибольшую популярность за год (по динамике). Практически без конкуренции Go завоевал награду на 2016 год.

Поэтому есть смысл специально для Go открыть тему.

Для знакомства (только для программистов с опытом) по Go можете посмотреть Go конспект :


Номер последней редакции: 1.41
Объём (страниц): 124
Размер файла текста: 601704
Размер архива кодов: 120492
Дата редактирования: 07 октября 2016

Активный (самый активный ;) ) русскоязычный ресурс по Go: Язык программирования Go.

21.01.2017 21:56 · отредактировано #419210

Хоть я и не программист, но мне он очень нравится. Недавно на нем написал маленькую программу, которая парсит cvs файл, пишет все в базу данных mysql и через веб морду предоставляет удобный поиск.

Кто кстати увлекается этим замечательным языком, то выкладываю код. Посмотрите на досуге. Мне кажется я там таких костылей наделал )) Но работает

Чисто код, без html

Показать
text
package main

import ( "crypto/md5" "database/sql" "encoding/csv" "fmt" "html/template" "io" "log" "net/http" "os"

_ "github.com/go-sql-driver/mysql" "github.com/gorilla/handlers" "github.com/gorilla/mux" "encoding/hex" )

var ( // uidRow int surnameRow string nameRow string middlenameRow string DateofBirthRow int addresRow string policyRow string )

func downloadData(w http.ResponseWriter, request *http.Request) { db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people") // db, err := sql.Open("mysql", "root:PASSWD@/base") if err != nil { panic(err) } defer db.Close()

err = db.Ping() if err != nil { panic(err.Error()) } file, err := os.Open("./makc31nas.csv") if err != nil { fmt.Println("Error:", err) return } defer file.Close() reader := csv.NewReader(file) reader.Comma = ';' reader.Comment = '#' reader.FieldsPerRecord = -1 reader.TrimLeadingSpace = true

lineCount := 1 for { record, err := reader.Read() if err == io.EOF { break } else if err != nil { fmt.Println("Error:", err) lineCount++ reader.Read() continue }

dbDrop, err := db.Prepare("DROP TABLE IF EXISTS november") if err != nil { panic(err.Error()) } defer dbDrop.Close()

dbIns, err := db.Prepare("INSERT INTO november VALUES( ?, ?, ?, ?, ?, ?, ? )") if err != nil { panic(err.Error()) } defer dbIns.Close()

_, err = dbIns.Exec(lineCount, record[0], record[1], record[2], record[3], record[5], record[11]) if err != nil { panic(err.Error()) // proper error handling instead of panic in your app } lineCount++ } }

func createUser(w http.ResponseWriter, request *http.Request) { w.Header().Set("Content-type", "text/html") t, _ := template.ParseFiles("./views/createUser.html") t.Execute(w, nil) }

func GetMD5Hash(text string) string { hasher := md5.New() hasher.Write([]byte(text)) return hex.EncodeToString(hasher.Sum(nil)) }

func users(w http.ResponseWriter, request *http.Request) { w.Header().Set("Content-type", "text/html") t, _ := template.ParseFiles("./views/users.html") t.Execute(w, nil) username := request.FormValue("username") password := request.FormValue("password") fmt.Fprint(w, username) fmt.Fprintf(w, " %x", md5.Sum([]byte(password)))

db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people") // db, err := sql.Open("mysql", "root:PASSWD@/base") if err != nil { panic(err) } defer db.Close()

err = db.Ping() if err != nil { panic(err.Error()) }

dbUserNew, err := db.Prepare("INSERT INTO users (username, password) VALUES (?,?)") //INSERT INTO users (username, password) VALUES ("admin", "21232f297a57a5a743894a0e4a801fc3"); if err != nil { panic(err.Error()) } defer dbUserNew.Close() passConvert := GetMD5Hash(password)

_, err = dbUserNew.Exec(username, passConvert) if err != nil { fmt.Println("ERRRRRRRRRRRROOORRR!!!") panic(err.Error()) // proper error handling instead of panic in your app }

}

func viewPeople(w http.ResponseWriter, request *http.Request) { w.Header().Set("Content-type", "text/html") t, _ := template.ParseFiles("./views/viewPeople.html") t.Execute(w, nil)

db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people") // db, err := sql.Open("mysql", "root:PASSWD@/base") if err != nil { panic(err) } defer db.Close()

err = db.Ping() if err != nil { panic(err.Error()) } surname := request.FormValue("surname") name := request.FormValue("name") middlename := request.FormValue("middlename") rows, err := db.Query("SELECT surname, name, middlename, DateofBirth, addres,"+" policy FROM november WHERE surname LIKE ? AND name LIKE ? AND middlename LIKE ?", surname+"%", name+"%", middlename+"%")

if err != nil { log.Fatal(err) } defer rows.Close()

for rows.Next() { if err := rows.Scan(&surnameRow, &nameRow, &middlenameRow, &DateofBirthRow, &addresRow, &policyRow); err != nil { log.Fatal(err) }

fmt.Fprint(w, "<tr><td>", surnameRow, "</td>", "<td>", nameRow, "</td>", "<td>", middlenameRow, "</td>", "<td>", DateofBirthRow, "</td>", "<td>", addresRow, "</td>", "<td>", policyRow, "</td></tr>") } fmt.Fprint(w, "</table>") }

func viewPeoplePolicy(w http.ResponseWriter, request *http.Request) { w.Header().Set("Content-type", "text/html") t, _ := template.ParseFiles("./views/viewPeoplePolicy.html") t.Execute(w, nil)

db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people") // db, err := sql.Open("mysql", "root:PASSWD@/base") if err != nil { panic(err) } defer db.Close()

err = db.Ping() if err != nil { panic(err.Error()) } policy := request.FormValue("policy") rows, err := db.Query("SELECT surname, name, middlename, DateofBirth, addres,"+" policy FROM november WHERE policy LIKE ?", "%"+policy+"%")

if err != nil { log.Fatal(err) } defer rows.Close()

for rows.Next() { if err := rows.Scan(&surnameRow, &nameRow, &middlenameRow, &DateofBirthRow, &addresRow, &policyRow); err != nil { log.Fatal(err) } fmt.Fprint(w, "<tr><td>", surnameRow, "</td>", "<td>", nameRow, "</td>", "<td>", middlenameRow, "</td>", "<td>", DateofBirthRow, "</td>", "<td>", addresRow, "</td>", "<td>", policyRow, "</td></tr>") } fmt.Fprint(w, "</table>") }

func main() { router := mux.NewRouter() router.Handle("/", http.FileServer(http.Dir("./views/")))

router.HandleFunc("/downloadData", downloadData) router.HandleFunc("/viewPeople", viewPeople) router.HandleFunc("/viewPeoplePolicy", viewPeoplePolicy) router.HandleFunc("/createUser", createUser) router.HandleFunc("/users", users)

router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))) http.ListenAndServe(":8989", handlers.LoggingHandler(os.Stdout, router)) }

Программа пока в разработке. В данный момент делаю авторизацию и добавление пользователей для будущей админки.

А вот новая IDE Goglang от jetbrains Пока еще в статусе тестирования. Прямая ссылка ниже.
http://go.jetbrains.com/n0QY0Tr01xQO0DV0Os30MT2

Уже пользуюсь ей, но на нетбуке, слабеньком, предпочитаю VSCode + plugins Полегче будет.

22.01.2017 13:44 #419214
XliN написал:

Уже пользуюсь ей, но на нетбуке, слабеньком, предпочитаю VSCode + plugins Полегче будет.

Чем оно лучше atom ?

22.01.2017 13:52 #419216
"ormorph" написал:
Чем оно лучше atom ?

Советую поставить и самому сделать вывод.

22.01.2017 14:07 #419217
XliN написал:
Советую поставить и самому сделать вывод

У меня как то vscode в некоторых местах не очень понравилось, например плагин markdown preview нельзя текст увеличить ctrl+. А так редакторы чем то похожи, скорость работы последних версий примерно одинаковая. По плагинами atom в переди.
На счёт поддержки go хотелось бы узнать, есть ли какие приемущества перед atom.

25.01.2017 14:07 #419293
"ormorph" написал:
А так редакторы чем то похожи, скорость работы последних версий примерно одинаковая. По плагинами atom в переди.
На счёт поддержки go хотелось бы узнать, есть ли какие приемущества перед atom.

А чем вообще хорош Atom ? (кроме того, что он модный, новый, быстро развивающийся, что у него комьюнити ... и др. бла-бла-бла что про него пишут)
Это я не для флейма спрашиваю, а действительно интересно ... от того, кто его использует.
Потому что понаписано про него масса, но внятного ничего не написано.

Чем Atom лучше, скажем Geany (они функционально близки)?
Atom, как я поверхностно смотрел, не входит в стандартный репозиторий ни одного дистрибутива Linux. Geany входит в стандартный репозиторий всех дистрибутивов Linux

Что и как нужно для поддержки Go из Atom?

25.01.2017 15:23 #419295
"Olej" написал:
Atom, как я поверхностно смотрел, не входит в стандартный репозиторий ни одного дистрибутива Linux. Geany входит в стандартный репозиторий всех дистрибутивов Linux

В gentoo входит.
[console]morph ~ $ eix app-editors/atom
app-editors/atom
Доступные версии: (~)1.12.2^m
Установленные версии: 1.12.2^m(06:08:59 05.01.2017)
Домашняя страница: https://atom.io
Описание: A hackable text editor for the 21st Century[/console]

Пакет по ебилду видно что устанавливается из rpm пакетов из github.com, ну а electron входит? Его как раз и использует atom.

Собственно неплохой редактор позиционируется как замена sublime-text. Имеет большое количество модулей, более тысячи.
Для поддержки go должны быть установлены соответствующие модули. Выбираешь Install a Package далее ввыбераеш install и в строке поиска вбиваешь go и жмешь enter, после этого будет предложены модули, которые можно будет установить щелкнув на install, либо просмотреть информацию по ним, можно и на сайте разработчика, ссылки есть.

Это больше чем просто редактор для программирования, это многофункциональный редактор, функционал которого можно расширять за счет модулей. Например модуль Markdown Preview Enhanced, позволяет писать документы, конвертировать их в pdf, создавать диаграммы, например на mermaid и прочее, в будущем заявлено что будет поддерживать экспорт в ebook(epub, mobi и т.д). Модуль Markdown Preview предназначен для визуализации результата написания руководств в формате .md для гитхаба. Модули можно обновлять.

Работает автоматическое дополнение функций и т.д. в прочем это все зависит от установленных модулей.

25.01.2017 16:15 · отредактировано #419300
"ormorph" написал:
Пакет по ебилду видно что устанавливается из rpm пакетов из github.com

Так как из github.com я могу и сам из https://atom.io/ закачать и установить.


Смущает то, что для работы он хочет Open a Project ... :-/ - отдельные файлы .c или .go он открывать не хочет ... опять начинаются выньдоуз-подобные-задрочки... с проектами, ульями и пчёлами...

25.01.2017 16:28 · отредактировано #419303
"Olej" написал:
Смущает то, что для работы он хочет Open a Project ... ao - отдельные файлы .c или .go он открывать не хочет ... опять начинаются выньдоуз-подобные-задрочки...

Неа открывать отдельные файлы и каталоги сверху меню File. Кроме того Open a Project просто открывает каталог, с лева будет доступен список файлов этого каталога по которым можно будет просто щелкнуть что бы открыть.

25.01.2017 16:48 · отредактировано #419306
"ormorph" написал:
Кроме того Open a Project просто открывает каталог, с лева будет доступен список файлов этого каталога по которым можно будет просто щелкнуть что бы открыть.

Щёлкать можно хоть до опупения, только файлы в каталоге серые, и не собираются они открываться...


Ну и вообще ... как-то не вдохновляет...
По крайней мере, для Go по функциональности и удобству - далеко уступает Geany.

25.01.2017 19:02 #419326

я им пользуюсь, попеременно с vscode, примерно одинаково, особенно если плагинами прокачать. Единственное чего мне не хватает и там и там это быстрая навигация между функциями и объектами. То есть навигация как раз есть, но она по поиску с хоткеем, а не в отдельном столбике сбоку который показывает все функции. мне последний вариант удобнее

29.01.2017 18:01 #419547

Вышло новое обновление Goglang IDE

Gogland (1.0 Preview) 1.0 EAP
Build #GO-163.10615.22, built on January 10, 2017
Gogland EAP User
Expiration date: April 10, 2017
JRE: 1.8.0_112-release-b460 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

21.03.2017 20:39 #421729
"dyasny" написал:
я им пользуюсь, попеременно с vscode, примерно одинаково, особенно если плагинами прокачать. Единственное чего мне не хватает и там и там это быстрая навигация между функциями и объектами. То есть навигация как раз есть, но она по поиску с хоткеем, а не в отдельном столбике сбоку который показывает все функции. мне последний вариант удобнее

нашел как это настроить в atom, в принципе теперь меня вообще все устраивает

Войдите или зарегистрируйтесь, чтобы ответить.