genbodev2
7/31/2017 - 10:28 AM

Уроки по golang

Уроки по 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
}
/////////////
/////////////
/////////////
/////////////