Golang
Содержание
- Variables
- Arrays, Slices
- Maps
- Functions
- For
- While
- Range
- If, switch
- Defer
- Structs (alike Class or Object)
Variables
var x int
var s string
var d int32
var b float32
var q float64
x := "Hello"
var x = "Hello"
x := 5
var x = 5
var c, python, java = true, false, "no!"
var i, j int = 1, 2
ВЫВОД типа переменной
fmt.Printf("i is of type %T\n", i) // out-> i is of type int
Arrays, Slices
Array(Массив) - имеет установленный размер
primes := [6]int{2, 3, 5, 7, 11, 13}
words := [3]string{"Hello", "mate", "world"}
Slices(Срезы) - массив с динамическим размером и более гибкий
q := []int{2, 3, 5, 7, 11, 13}
r := []bool{true, false, true, true, false, true}
a := make([]int, 5) // len(a)=5
fmt.Println(q[0:3]) // out-> 2, 3, 5
len(q) // длина
cap(q) // вместимое
Slice пустой == nil
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
Slice добавить в срез
var s []int
// append works on nil slices.
s = append(s, 0)
s = append(s, 2, 3, 4)
fmt.Println(s) // out-> 0, 2, 3, 4
Maps
Создание карты
// Создание карты
elements := map[string]string{
"H": "Hydrogen",
}
// OR
elements := make(map[sting]string)
Создание нового элемента
elements["Li"] = "Lithium" // +1 элемент в - elements
elements["Be"] = "Berrylium" // +1 элемент в - elements
fmt.Println(elements)
Проверка на существование эл. в карте
name, ok := elements["He"]
fmt.Println(name, ok)
Functions
Возвращение нескольких результатов
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
Возвращение названых переменных
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
For
FOR обычный
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
FOR без итератора
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
FOR без конца и края
for{
fmt.Println("Forever hello world")
}
While
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
Range
type User struct {
Id string
}
func main(){
var clients = make(map[User]string)
...
// так выведет значение ключа(key)
for client := range clients {
fmt.Println(client)
fmt.Println(client.Id)
}
// так выведет значение (value)
for _, client := range clients {
fmt.Println(client)
}
// так выведет оба значения(key & value)
for i, client := range clients {
fmt.Println(i.Id)
fmt.Println(client)
}
If, switch
If
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim { // вот тут сначала исполняеться функция math.Pow(),
// и результат идет в "v", а потот юзаеться в сравненнии "v < lim"
return v
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
Switch обычный
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
Switch без условия.
Если условия нет, значит идет как "true". Это можно использовать вместо длинных if - elseif - else
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
Defer
defer - выполниться после достижение и окончания последней строки ф-ции в которой она написана
defer fmt.Println("world")
fmt.Println("hello")
Также можно накидывать в очередь выполнения defer (отработает по типу last-in-first-out)
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
Structs (alike Class)
Struct как объект
type Vertex struct {
X int
Y int
}
func main() {
fmt.Println(Vertex{1, 2})
// вот тут похоже на объект из JS
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)
}
Struct как класс
type Vertex struct {
name string
}
func (v Vertex) Say() {
fmt.Println("It say Vertex method")
fmt.Println("name =" + v.name)
}
func main() {
v := Vertex{name: "Krake"}
v.Say()
gg := Vertex{name: "Vasiliy"}
gg.Say()
}