Структури от данни

15.10.2013

Но преди това...

Въпрос за мъфин #1

Функциите в Go могат ли да приемат по повече от един аргумент? Могат ли да връщат по повече от един аргумент? Могат ли да приемат произволен брой аргументи? Могат ли да връщат произволен брой аргументи?

Въпрос за мъфин #2

За какво се ползва ключовата дума func в езика?

Въпрос за мъфин #3

За какво се ползва _?

Въпрос за мъфин #4

Какво значи closure и има ли той почва у Go?

Въпрос за мъфин #5

Кажете няколко разлики между C и Go указателите.

Arrays

package main

import "fmt"

func main() {
    var x [5]float64
    x[0] = 98
    x[1] = 93
    x[2] = 77
    x[3] = 82
    x[4] = 83

    var total float64 = 0
    for i := 0; i < 5; i++ {
        total += x[i]
    }
    fmt.Println(total / 5)
}

Очевидно броим от 0

Инициализация

var x [5]float64
x[0] = 98
x[1] = 93
x[2] = 77
x[3] = 82
x[4] = 83

или накратко:

x := [5]float64{98, 93, 77, 82, 83}

Полезнотии

for index, value := range arr {
    ...
}



for index := 0; index < len(arr); index++ {
    value := arr[index]
    ...
}

Тези два цикъла са еквивалентни

Slices

Като масивите имат дължина и могат да се индексират, но дължината им може да се променя.

var x []float64

Горното само създава променливата, а се инициализира по следния начин:

x := make([]float64, 5)

Това указва на слайса да бъде с размер 5. Всеки слайс е част от масив с не по-малка дължина от слайса.

x := make([]float64, 5, 10)

Това е същото като горното, но този слайс сочи към масив с размер 10.

Слайсове в действие

arr := [6]float64{1,2,3,4,5,6}
x := arr[1:5]

Създаваме слайс от втори до четвърти елемент включително на масива arr.

x := arr[2:] // Взема всички без първите два елемента
x := arr[:2] // Взема първите два елемента
x := arr[:]  // Взема всички елементи

Структура

x := []int{2, 3, 5, 7, 11}
y := x[1:3]

Полезнотии

append

slice1 := []int{1,2,3}
slice2 := append(slice1, 4, 5)

1. Създаваме slice1 с три елемента
2. От slice1 правим slice2, с още два елемента в края

slice1 := []int{1,2,3}
slice1 = append(slice1, 4, 5)

1. Създаваме slice1 с три елемента
2. Добавяме два елемента в края му

copy

slice1 := []int{1,2,3}
slice2 := make([]int, 2)
copy(slice2, slice1)

1. Създаваме slice1 с три елемента
2. Създаваме slice2 с два елемента (нули)
3. Копираме първите два елемента от slice1 в slice2

len и cap

Maps

Неподредена колекция от двойки ключове и стойности

var x map[string]int

Ключовете в x са низове, а стойностите числа

За да го инициализраме, ползваме make:

x := make(map[string]int)

Ползваме го както масиви и слайсове:

x["key"] = 10

За да вземем двойка по ключ:

value, ok := x["key"]

ok е true, ако съществува двойка с такъв ключ. В противен случай value е nil

Полезнотии

x := make(map[string]int)
delete(x, "key")

Изтрива двойката, чийто ключ е "key"

if name, ok := x["key"]; ok {
    fmt.Println(name, ok)
}

Structs

type Person struct {
    name string
    age uint
}

var chochko Person
chochko.name = "Чочко"
chochko.age = 27

Други начини за инициализиране:

chochko := Person{name: "Чочко", age: 27}
chochko := Person{"Чочко", 27}

new()

chochko := new(Person)
chochko.name = "Чочко"
chochko.age = 27

new() vs. make()

new само заделя памет, а make инициализира, т.е.:

package main

import "fmt"

type example struct {
    attrs map[string]int
}

func main() {
    e := new(example)
    e.attrs = make(map[string]int)
    e.attrs["h"] = 42
    fmt.Println(e)
}

Въпроси?