181 lines
5.5 KiB
Go
181 lines
5.5 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"reflect"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
func main() {
|
|||
|
fmt.Println("Slices are dynamically-sized, flexible view into the elements of an arrary")
|
|||
|
fmt.Println("Generally more common than arrays")
|
|||
|
fmt.Println("Just dont use size in square brackets, thats the difference .d")
|
|||
|
|
|||
|
fmt.Println("You can slice arrays like this:")
|
|||
|
|
|||
|
primes := [6]int{2, 3, 5, 7, 11, 13}
|
|||
|
var s []int = primes[1:4] // from index 1 to 4 (exclude 4) (1-2-3)
|
|||
|
fmt.Println(s)
|
|||
|
|
|||
|
// s[10] = 1 // runtime ERROR (panic: runtime error: index out of range [10] with length 3)
|
|||
|
|
|||
|
fmt.Println("Changing the slice of an array also changes array index, see below:")
|
|||
|
s[2] = 10
|
|||
|
fmt.Println(s)
|
|||
|
fmt.Println(primes)
|
|||
|
|
|||
|
fmt.Println("This because slices are like references to arrays")
|
|||
|
fmt.Println("Also same thing with multiple slices:")
|
|||
|
|
|||
|
names := [5]string{"Gary", "Earl", "Billy", "Felix", "Mary"}
|
|||
|
fmt.Println(names)
|
|||
|
|
|||
|
a := names[0:3]
|
|||
|
b := names[1:5]
|
|||
|
c := names[2:5]
|
|||
|
d := names[3:5]
|
|||
|
e := names[4:5]
|
|||
|
|
|||
|
fmt.Println(a, b)
|
|||
|
|
|||
|
b[1] = "DELETED"
|
|||
|
|
|||
|
fmt.Println(a, b)
|
|||
|
fmt.Println(names)
|
|||
|
|
|||
|
fmt.Printf("\nN: %p: %p, %p, %p, %p, %p\n", &names, &names[0], &names[1], &names[2], &names[3], &names[4])
|
|||
|
fmt.Printf("A: %p: %p, %p, %p, %p\n", &a, a, &a[0], &a[1], &a[2])
|
|||
|
fmt.Printf("B: %p: %p, %p, %p, %p, %p\n", &b, b, &b[0], &b[1], &b[2], &b[3])
|
|||
|
fmt.Printf("C: %p: %p, %p, %p, %p\n", &c, c, &c[0], &c[1], &c[2])
|
|||
|
fmt.Printf("D: %p: %p, %p, %p\n", &d, d, &d[0], &d[1])
|
|||
|
fmt.Printf("E: %p: %p, %p\n", &e, e, &e[0])
|
|||
|
|
|||
|
// TODO names içindeki stringler nerede depolanıyor, stringleri ne kadar uzatsam da sadece 10 bit yer kaplıyor. Bu nasıl oluyor.
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("Slice literals are like array literals without the length")
|
|||
|
|
|||
|
arr := [3]bool{true, false, false} // THIS CREATES ARRAY
|
|||
|
sli := []bool{true, false, false}
|
|||
|
fmt.Println("This creates the same array as above, then builds a slice that references it")
|
|||
|
|
|||
|
fmt.Printf("%T: %v\n", arr, arr)
|
|||
|
fmt.Printf("%T: %v\n", sli, sli)
|
|||
|
|
|||
|
fmt.Printf("%p, %p, %p, %p, %p\n", &arr, arr, &arr[0], &arr[1], &arr[2])
|
|||
|
fmt.Printf("%p, %p, %p, %p, %p\n", &sli, sli, &sli[0], &sli[1], &sli[2])
|
|||
|
fmt.Printf("%s, %s\n", reflect.TypeOf(&sli), reflect.TypeOf(&arr))
|
|||
|
|
|||
|
// TODO slice başka bir yerde tanımlanan bir pointer aslında, ve herhangi bir yerde (bir değişkene atılmamış) depolanan array'i işaret ediyor, doğru muyum? Yani ben sli[2] dediğim zaman, sli->gösterdiği yer(gerçek array'in başı)->+2 yapıp arraydeki yeri mi gösteriyor? Ya da tam tersi her index için ayrı bir pointer mı tutuluyor (sanmıyorum)
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("You can also use slices with struct:")
|
|||
|
|
|||
|
myvar := []struct {
|
|||
|
i int
|
|||
|
b string
|
|||
|
}{
|
|||
|
{2, "apple"},
|
|||
|
{5, "strawberry"},
|
|||
|
{3, "watermelon"},
|
|||
|
}
|
|||
|
|
|||
|
fmt.Println(myvar, myvar[0], myvar[0].i)
|
|||
|
fmt.Printf("%p, %p\n", myvar, &myvar)
|
|||
|
fmt.Printf("%p, %p, %p\n", &myvar[0], &myvar[0].i, &myvar[0].b)
|
|||
|
fmt.Printf("%p, %p, %p\n", &myvar[1], &myvar[1].i, &myvar[1].b) // TODO 2 fark neden var !!!??
|
|||
|
fmt.Printf("%p, %p, %p\n", &myvar[2], &myvar[2].i, &myvar[2].b)
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("The default is zero for the low bound and the length of the slice for the high bound")
|
|||
|
|
|||
|
myvar2 := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
|||
|
fmt.Println("These are same:")
|
|||
|
fmt.Println(myvar2[0:10])
|
|||
|
fmt.Println(myvar2[:10])
|
|||
|
fmt.Println(myvar2[0:])
|
|||
|
fmt.Println(myvar2[:])
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("Slice has both len (Length) and cap (Capacity)")
|
|||
|
fmt.Println("Capacity is the number of elements in the underlying array, counting from the first element in the slice")
|
|||
|
|
|||
|
// 0 1 2 3 4 5 6
|
|||
|
myslice1 := []int{1, 2, 3, 4, 5, 6, 7}
|
|||
|
printSlice(myslice1)
|
|||
|
// 0 1 2 3 4
|
|||
|
myslice1 = myslice1[2:4] // [3 4 -5- -6- -7-]
|
|||
|
printSlice(myslice1)
|
|||
|
|
|||
|
myslice1 = myslice1[:5]
|
|||
|
printSlice(myslice1)
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("The zero value for a slice is `nil`")
|
|||
|
var myslice2 []int
|
|||
|
printSlice(myslice2)
|
|||
|
if myslice2 == nil {
|
|||
|
fmt.Println("Slice is nil!")
|
|||
|
}
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("Slices can be created with built-in `make` function")
|
|||
|
fmt.Println("`make` allocates zeroed array and returns a slice that refers to that array")
|
|||
|
|
|||
|
// make(TYPE, LEN, CAP)
|
|||
|
|
|||
|
myslice3 := make([]int, 5)
|
|||
|
printSlice(myslice3)
|
|||
|
|
|||
|
myslice4 := make([]int, 5, 10)
|
|||
|
printSlice(myslice4)
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("Slices can contain any type, including other slices")
|
|||
|
board := [][]string{
|
|||
|
[]string{"_", "_", "_"},
|
|||
|
[]string{"_", "_", "_"},
|
|||
|
[]string{"_", "_", "_"},
|
|||
|
}
|
|||
|
|
|||
|
printSlice2(board)
|
|||
|
|
|||
|
board[2][0] = "X"
|
|||
|
board[0][2] = "X"
|
|||
|
board[1][1] = "O"
|
|||
|
|
|||
|
for i := 0; i < len(board); i++ {
|
|||
|
fmt.Printf("%s\n", strings.Join(board[i], " "))
|
|||
|
}
|
|||
|
|
|||
|
fmt.Printf("\n\n")
|
|||
|
fmt.Println("Go also provides built-in append function")
|
|||
|
|
|||
|
var myslice5 []int
|
|||
|
printSlice(myslice5)
|
|||
|
|
|||
|
fmt.Printf("%p, %p\n", myslice5, &myslice5)
|
|||
|
|
|||
|
myslice5 = append(myslice5, 1, 2, 3)
|
|||
|
printSlice(myslice5)
|
|||
|
fmt.Printf("%p, %p\n", myslice5, &myslice5)
|
|||
|
|
|||
|
myslice5 = myslice5[:1] //
|
|||
|
// TODO Bunu yorum satırına alınca ilk pointer değeri değişiyor. Açınca ise değişmiyor. Büyük ihtimal farklı bir yere işaretçi tanımlıyor ama bu işaretçi neyin. Array'in mi Slice'ın mı???
|
|||
|
|
|||
|
myslice5 = append(myslice5, 4)
|
|||
|
printSlice(myslice5)
|
|||
|
fmt.Printf("%p, %p\n", myslice5, &myslice5)
|
|||
|
|
|||
|
fmt.Printf("\n%v, %v\n", reflect.ValueOf(myslice5).Kind(), reflect.ValueOf(&myslice5).Kind())
|
|||
|
fmt.Printf("%v, %v\n", reflect.ValueOf(myslice5[1]).Kind(), reflect.ValueOf(&myslice5[1]).Kind())
|
|||
|
}
|
|||
|
|
|||
|
func printSlice(s []int) {
|
|||
|
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
|
|||
|
}
|
|||
|
|
|||
|
func printSlice2(s [][]string) {
|
|||
|
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
|
|||
|
}
|