Struktury danych w Go - Dziennik pokładowy #2

Kamil Powroźnik

2019-05-20T21:46+02:00 | 4 min

Życie programisty byłoby strasznie uporczywe, gdyby nie złożone struktury danych takie jak tablice czy obiekty. Dziś porozmawiamy o tym, jak wygląda to w języku go.

Podstawowymi złożonymi typami danych są tablice, struktury oraz mapy. Możemy w nich przechowywać każdy z dostępnych w go typów podstawowych. Przejdźmy zatem do poznania typu tablicy oferowanego przez ten język.

Tablice

Tablica może zostać przypisana do zmiennej za pomocą wyrażenia

var a = [2]string

Co oznacza powyższy literał? Właśnie do zmiennej a przypisaliśmy tablicę o długości dwóch elementów typu string.

Do danych elementów tablicy możemy przypisać wartości za pomocą odwołania się do indexu

a[0] = "John"
a[1] = "Doe"

Kolejnym sposobem tworzenia tablic jest użycie magicznego operatora dostępnego w go

a := [2]string{
	"John",
	"Doe",
}

Jak widać, zdefiniowałem tutaj tablicę identyczną jak powyżej, a za pomocą nawiasów, uzupełniłem ją o potrzebne wartości.

slice

Dużo częściej używaną odmianą jest typ slice, bazuje on na tablicach, jednak różni się tym, że nie musi mieć ściśle określonej długości.

b := []int{1, 2, 3}

Używając typu slice, możemy również tworzyć wycinki z istniejących tablic

a := [3]string{
	"John",
	"Henry",
	"Doe",
}

var b []string = a[1:2]

wbudowane funkcje

Go oferuje nam dwie wbudowane funkcje, które pozwolą nam dostać się do pewnych właściwości tablicy.

Funkcja len() zwróci długość tablicy, którą podamy jako argument. cap() natomiast, jest funkcją która zwróci nam pojemność tablicy (w przypadku typu slice pojemność będzie równa długości).

Kolekcje

Kolejnym typem danych oferowanym przez go jest struct. Przypomina on obiekty w JavaScript i jest kolekcją pól o określonym typie.

Zobaczmy zatem jak zdefiniować taką kolekcje.

type User struct {
	name     string
	age      int
	email    string
	password string
}

func main() {

	firstUser := User{
		"John", 24, "go@bycfrontendem.blog", "goIsTheBest",
	}

	fmt.Println(firstUser)

}

Jak widzisz zdefiniowałem tutaj kolekcję o nazwie User, która posiada pola o odpowiednich typach przewidzianych dla naszego użytkownika.

Dostęp do właściwości kolekcji odbywa się tak jak w JavaScript za pomocą kropki. Przykładowo chcąc dostać email użytkownika użyjemy notacji

fmt.Println(firstUser.email)

Map

Ostatnim złożonym typem jest map. Typ ten jest swoistym odpowiednikiem tablicy asocjacyjnej jednak różni się sposobem zapisu i dostępu do wartości. W tym wypadku nie mamy do czynienia z indeksami jak w zwykłej tablicy, a z kluczami.

Przykład:

var a = map[string]int{
	"two":   2,
	"three": 3,
}

fmt.Println(a["two"]) // 2
fmt.Println(a)        // map[three:3 two:2]

Ponadto klucz może być dowolnym typem:

type test struct {
	id   int
	name string
}

func main() {

	var a = map[test]int{
		test{1, "String1"}: 2,
		test{2, "String2"}: 3,
	}

	fmt.Println(a) // map[{1 String1}:2 {2 String2}:3]

	fmt.Println(a[test{1, "String1"}]) // 2
}

Mam nadzieje, że Ci się spodobało, w następnym poście porozmawiamy o funkcjach i interfejsach. Do zobaczenia 😄


Hej, ta strona wykorzysuje pliki cookies, localStorage, sessionStorage oraz dane osobowe do celów analitycznych.