Ana içeriğe geç

Bölüm 04/09: Veri Tipleri

Tip Dönüştürmek

Type Conversion yani tipleri birbirine dönüştürmek. Aynı familyadan türeyen tipleri çevirmek daha kolayken, alakasız tipleri arasında çevirmek bazen mümkün değil. int’i float64’e çevirmek kolay;

var i int = 42
var f float64 = float64(i)

Dikkat ettiyseniz aslında tip işaretçisi (type identifier) olan float64 aynı bir fonksiyon gibi çağırılabiliyor. Örnekteki f’i uint’e de çevirsek;

var i int = 42
var f float64 = float64(i)
var u uint = uint(f)

// aynı işi bu şekilde de yapabiliriz:
i := 42
f := float64(i)
u := uint(f)

Peki, elimizde sayısal bir değer var bunu metinsel (string) değere çevirmek istiyoruz:

https://go.dev/play/p/gZ3Xjujw8UN

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := 5

    var s string

    s = strconv.Itoa(i)          // Integer to Ascii
    fmt.Printf("%v, %[1]T\n", s) // 5, string

    // aslında strconv.Itoa bir kısa yol
    s = strconv.FormatInt(int64(i), 10)
    fmt.Printf("%v, %[1]T\n", s) // 5, string
}

Peki string’i sayıya nasıl çevireceğiz?

https://go.dev/play/p/-1r2gsSTf1i

package main

import (
    "fmt"
    "log"
    "strconv"
)

func main() {
    s := "5"
    var i int

    n, err := strconv.Atoi(s) // Ascii to integer
    if err != nil {
        log.Fatal(err) // error'ü ekrana yaz va os.Exit(1)
    }

    i = n
    fmt.Printf("%v, %[1]T\n", i) // 5, int
    fmt.Printf("%d, %[1]T\n", i) // 5, int

    // aslında strconv.Atoi bir kısa yol

    ii, err := strconv.ParseInt(s, 10, 0)
    if err != nil {
        log.Fatal(err) // error'ü ekrana yaz va os.Exit(1)
    }
    i = int(ii)
    fmt.Printf("%v, %[1]T\n", i) // 5, int
    fmt.Printf("%d, %[1]T\n", i) // 5, int
}

Type Alias

Kendi oluşturduğumuz tipler aslında varolan (built-in gelen) tiplere bir tür kısa yol. Kod içinde uygun tip kontrolleri yapmak, daha az kod yazmak için kullanılır:

https://go.dev/play/p/pkVgdra5tQQ

package main

import "fmt"

// myString'in altında yatan tip built-in string
type myString string

func greet(s myString) {
    fmt.Println("greet:", s)
}

func main() {
    s := myString("hello")
    ss := "hello"

    fmt.Printf("%s, %[1]T\n", s)  // hello, main.myString
    fmt.Printf("%s, %[1]T\n", ss) // hello, string

    // fmt.Println(s == ss)
    // error
    // invalid operation: s == ss (mismatched types myString and string)

    greet(s) // greet: hello

    // greet(ss)
    // error
    // annot use ss (variable of type string) as myString value in argument to greet

    // ss'i yani düz string'i myString tipine çevirdik
    greet(myString(ss)) // greet: hello

    fmt.Println(string(s) == ss)   // true
    fmt.Println(s == myString(ss)) // true
}