Уроки по golang
// go build + run *.exe
// go run main.go
// GOROOT и GOPATH
// GOROOT - устанавливается автоматом в windows (обычно это сам язык в папке c:/Go)
// GOPATH - это файлы проекта. Заводим папку c:/GoPath, в эту папку располагаем папки src, pkg, bin
// src - это файлы go
// pkg - это файлы *.a (исполняемый файл пакета)
// bin - это файлы, которые можно выполнить после компиляции
// set GOPATH=c:\GoPath (в командной строке)
// Далее создаем проект: c:\GoPath\src\my
// Создаем файл my.go в нем добавляем package main - это создаст exe-файл, который упадет в bin (../bin/my.exe)
// Для создания подключаемого пакета создаем иную папку c:\GoPath\src\mypack
// В нее ложим pack.go и прописываем в него: package mypack
// Далее "ссылаемся" на пакет из главного my.go: import "mypack" (по имени папки)
// При компиляции будет создан mypack.a
// С папкой : c:\GoPath\src\PACK\mypack -> import "my/PACK" -> c:\GoPath\pkg\{}\my\PACK.a
// ТУТ ПОДРОБНЕЕ https://github.com/astaxie/build-web-application-with-golang/blob/master/ru/01.2.md
/////////////
package main
import "fmt"
func main() {
fmt.Println(MyFunc(12, 13))
}
func MyFunc(a, b int) (int, int) {
return a, b
}
/////////////
package main
import "fmt"
func main() {
// Создание массивов
//a := []string{"Hello", "World"}
//a := []int{12,13,14}
//arr := make([]string,5) // 5-длина
//arr := make([]uint, 5)
//fmt.Println(len(arr)) // Покажет длину
//arr = append(arr, 5, 6, 7) // Добавление в массив
//arr2 := append(arr, 5, 6, 7)
//fmt.Println(len(arr2))
arr := []uint{1, 2, 3, 4, 5}
// Циклы по массивам
/*for i := 0; i < len(arr); i++ {
fmt.Println(arr[i])
}*/
// Go цикл
/*for key, value := range arr {
fmt.Println("key is ", key)
fmt.Println("val is ", value)
}*/
// Для пропуска key
/*for _, value := range arr {
fmt.Println("val is ", value)
}*/
/*for range arr {
fmt.Println("Show me 5 times")
}*/
// Вывод из массива
//fmt.Println(arr[0]) // Первый элемент
//fmt.Println(arr[1:3]) // Со 2-го по 4
//fmt.Println(arr[len(arr) - 1]) // Последний
}
/////////////
// Если переменная или метод с маленькой буквы - она будет доступна только внутри этого пакета
/////////////
// Свои типы данных
package main
import "fmt"
type MyOwnInt uint // Создает свой тип с типом uint
func main() {
a := new(MyOwnInt) // Сейчас в a лежит аоес памяти
*a = 15 // Разименовываем, чтобы записать значение
fmt.Println(*a) // Выводим 15
}
/////////////
// Константы
package main
import "fmt"
const MyConst string = "Const"
const MyConst2 uint = 12314
const(
five int = 5
ten int = 10
)
const (
ONE = 1
TWO = 2
)
// Генератор констант
const (
a = iota
b
c
d
e
)
const (
_ = iota // Пропустит 0
bb
cc
dd
ee
)
const (
_ = iota // Пропустит 0
bbb = iota * 10 // Все следующие значения умножаться на 10
ccc
ddd
eee
)
func main() {
// b = "324" // Не возможно изменить значение константы
fmt.Println(a) // Покажет 0
fmt.Println(bb) // Покажет 1
fmt.Println(bbb) // Покажет 10
fmt.Println(ccc) // Покажет 20
}
/////////////
// Строки
package main
func main() {
a := "Hello World"
b := `Hello World` // Косые кавычки также подходят для типа string
c := `{"Key": "Value"}` // Составление JSON
d := 'a' // Руна (один символ) или char в др. языках
// Отправка массива со строкой на сервер, если он принимает байты
e := "Hello World"
f := []byte(a) // массив-байт
}
/////////////
// Преобразование, обработка ошибок
package main
import (
"fmt"
"strconv"
)
func main() {
// В переменную num запишем преобразование string в int, добавим переменную для хранения ошибки
num,err := strconv.Atoi("10")
if err != nil {
fmt.Println(err.Error()) // Вывод строки с ошибкой
}
fmt.Println(num) // покажет 10
// Пример с ошибкой
num1,err := strconv.Atoi("abcd")
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(num1) // 0 и ошибку strconv.Atoi: parsing "abcd": invalid syntax
strconv.Itoa(10) // Из string в int
strconv.ParseBool("32") // В bool
strconv.ParseFloat("32,22", 64) // В float с указанной битностью
num2, _ := strconv.Atoi("10") // Пропуск переменной err
}
/////////////
// struct - коллекции полей
package main
import (
"fmt"
)
type MyObject struct {
MyString string
MyInt int
}
func main() {
myObj := new(MyObject)
myObj.MyString = "Go is the best programming language" // &{Go is the best programming language 12}
myObj.MyInt = 12
fmt.Println(myObj)
}
// Рекомендованный
myObj := MyObject{MyString: "Go is the best programming language", MyInt: 12}
/////////////
// Добавление метода и его вызов
package main
import (
"fmt"
)
type MyObject struct {
MyString string
MyInt int
}
func main() {
myObj := MyObject{
MyString: "Hello",
MyInt: 12, // Должна быть запятая
}
_ = myObj // Компилятор не будет ругаться
MyObject{}.myFunc() // Вызов
}
func (m MyObject)myFunc() {
fmt.Println("Some Word")
}
/////////////
// Вызов функции через подключение пакета
// user.go
package models
import (
"math/rand" // Для встроенной функции rand
"fmt"
)
type User struct {
ID int64
FirstName string
LastName string
salary int
}
func NewUser(name string, surname string, salary int) *User {
return &User{
ID: rand.Int63n(100),
FirstName: name,
LastName: surname,
salary: salary,
}
}
func(u *User)GetSalary() {
fmt.Println(u.ID, u.salary + 2000, u.LastName)
}
// main.go
package main
import "studyGO/models"
func main() {
user := models.NewUser("Stiven", "Spilberg", 100)
user.GetSalary() // 10 2100 Spilberg
}
/////////////
/////////////
/////////////
/////////////