Golang 101: Kesit (Slice)
Tags: go, slice
Published: 2021-10-07 11:06:55

Kesit (Slice) bir bakıma dizidir fakat diziden en önemli farkı boyutunun değiştirilebilir olmasıdır. Kesitler genişleyebilirler, bölünebilirler.
```golang
package main

import "fmt"

func main() {

	// Kesit Oluşturma
	kesit := make([]string, 3)
	fmt.Println("Boş kesit:", kesit)

	// Değer Atama
	kesit[0] = "a"
	kesit[1] = "b"
	kesit[2] = "c"
	fmt.Println("Kesit:", kesit)
	fmt.Println("Boyut:", len(kesit))
	fmt.Println("Kapasite:", cap(kesit))

	// Kesiti Genişletme
	kesit = append(kesit, "d")
	kesit = append(kesit, "e", "f")
	fmt.Println("Yeni Kesit:", kesit)

	// Kesiti Kopyalama
	c := make([]string, len(kesit))
	copy(c, kesit)
	fmt.Println("Kopya Kesit:", c)

	// Kesiti Bölme
	k := kesit[2:5]
	fmt.Println("Kesit Bölme 1:", k)

	k = kesit[:5]
	fmt.Println("Kesit Bölme 2:", k)

	k = kesit[2:]
	fmt.Println("Kesit Bölme 3:", k)

	// Kesit Tanımı ve Değer Atama
	t := []string{"g", "h", "i"}
	fmt.Println("Kesit 2:", t)

	// 2 Boyutlu Kesit
	kesit2 := make([][]int, 3)
	for i := 0; i < 3; i++ {
		boyut := i + 1
		kesit2[i] = make([]int, boyut)
		for j := 0; j < boyut; j++ {
			kesit2[i][j] = i + j
		}
	}
	fmt.Println("2 Boyutlu Kesit: ", kesit2)
}
```
```
Boş kesit: [  ]
Kesit: [a b c]
Boyut: 3
Kapasite: 3
Yeni Kesit: [a b c d e f]
Kopya Kesit: [a b c d e f]
Kesit Bölme 1: [c d e]
Kesit Bölme 2: [a b c d e]
Kesit Bölme 3: [c d e f]
Kesit 2: [g h i]
2 Boyutlu Kesit:  [[0] [1 2] [2 3 4]]
```
[çalıştır!](https://go.dev/play/p/6hxAJnZ63-a)

## Kesit Oluşturma
```golang
	kesit := make([]string, 3)
	fmt.Println("Boş kesit:", kesit)
```
Kesitler `make` fonksiyonu ile tür ve eleman sayısı belirtilerek oluşturulur. Örnekte 3 elemanlı `[]string` türünde bir `slice` oluşturuldu.

## Değer Atama
```golang
	kesit[0] = "a"
	kesit[1] = "b"
	kesit[2] = "c"
	fmt.Println("Kesit:", kesit)
	fmt.Println("Boyut:", len(kesit))
	fmt.Println("Kapasite:", cap(kesit))
```
Kesitlere dizilerde olduğu gibi değer atanır. Kesit boyutuna dizide olduğu gibi `len()` ile bakılabilir. Aynı zamanda kesitin kapasitesine de `cap()` ile bakabilirsiniz.

## Kesiti Genişletme, Değer Ekleme
```golang
	kesit = append(kesit, "d")
	kesit = append(kesit, "e", "f")
```
Kesiti genişletmek için `append()` fonksiyonu kullanılır. Birden fazla değeri tek seferde ekleyebilirsiniz.

## Kesiti Kopyalama
```golang
	c := make([]string, len(kesit))
	copy(c, kesit)
```
Mevcut kesiti `copy()` fonksiyonu ile kopyalayabilirsiniz. Örnekte önce boş bir kesit olarak `c` değişkeni oluşturuluyor. Oluşturulan `c`'nin eleman sayısı kopyalanacak kesitin sayısıyla eşit olsun diye `len()` ile belirtiliyor. 

## Kesiti Bölme
```golang
	k := kesit[2:5]

	k = kesit[:5]

	k = kesit[2:]
```
Kesiti belirli bir elemanından başlayarak `kesit[2:5]`, belirli bir elemanına kadar `kesit[:5]` veya belirli bir elemanından başlayarak sonuna kadar bölüp yeni değişkene atanabilirsiniz.

## Kesit Tanımı ve Değer Atama
```golang
	t := []string{"g", "h", "i"}
```
Kesitler tanımlanırken de değer ataması yapılabilir.

## 2 Boyutlu Kesit
```golang
	kesit2 := make([][]int, 3)
	for i := 0; i < 3; i++ {
		boyut := i + 1
		kesit2[i] = make([]int, boyut)
		for j := 0; j < boyut; j++ {
			kesit2[i][j] = i + j
		}
	}
```
Kesit 2 boyutlu olarak oluşturulabilir. Yukarıdaki örnekte öncelikle `kesit2` adıyla 2 boyutlu kesit oluşturulmaktadır. `for` döngüsü ile de `kesit2`'ye yeni kesitler ve onlara da yeni kesitler eklenerek 2. boyut elde edilmiş olur, Inception :)