diff --git a/types/main.go b/types/main.go new file mode 100644 index 0000000..130c9a0 --- /dev/null +++ b/types/main.go @@ -0,0 +1,136 @@ +package main + +import ( + "fmt" + "strconv" +) + +type myFloat = float64 +type myint int + +// func (m myFloat) double() myFloat { + +// } + +type person struct { + age int + name string +} + +type student struct { + age int // try swapping these fields + name string +} + +func (m myint) double() myint { + return m * 2 +} + +func main() { + var a uint8 = 1 + var b uint16 = 2 + var c uint32 = 3 + var d uint64 = 4 + + var e int8 = 1 + var f int16 = 2 + var g int32 = 3 + var h int64 = 4 + + var i float32 = 1.1 + var j float64 = 1.2 + + var k bool = true + + var l byte = 'c' + var m byte = 99 + var n rune = '😀' + var o rune = 128512 + + var p string = "hello" + + var arr = [5]int{} + var slice = []int{} + var maps = map[int]int{} + + type empty struct{} + var x = empty{} + + var y interface{} = x + + var function = func() int { + return 42 + } + + var aliasInt myint = 1 + var aliasFloat myFloat = 5.0 + + fmt.Printf("Type of a=%T, b=%T, c=%T, d=%T\n", a, b, c, d) + fmt.Printf("Type of e=%T, f=%T, g=%T, h=%T\n", e, f, g, h) + fmt.Printf("Type of i=%T, j=%T\n", i, j) + fmt.Printf("Type of k=%T\n", k) + fmt.Printf("Type of l=%T, m=%T, n=%T, o=%T\n", l, m, n, o) + fmt.Printf("Type of p=%T\n", p) + fmt.Printf("Type of arr=%T\n", arr) + fmt.Printf("Type of arr=%T\n", slice) + fmt.Printf("Type of arr=%T\n", maps) + fmt.Printf("Type of x=%T\n", x) + fmt.Printf("Type of y=%T\n", y) + fmt.Printf("Type of function=%T\n", function) + fmt.Printf("Type of aliasInt=%T, aliasFloat=%T\n", aliasInt, aliasFloat) + conversion() + + definedTypeConversion(aliasInt) + definedTypeConversion(5) + + takesInt(5) + // takesInt(aliasInt) // this does not work + + takesFloat(5) + takeInt64(5) + takeInt8(5) // try passing > 128 +} + +func conversion() { + var i int = 355 // type int + f := float64(i) // type float64 + b := i != 0 // type bool + s := strconv.Itoa(i) + by := byte(i) + + ui8 := 250 + i8 := int8(ui8) + + fmt.Printf("%d\t%f\t%t\t%s\t%c\t%d\t%d\n", i, f, b, s, by, ui8, i8) + + p := person{age: 20, name: "john"} + std := student{age: 15, name: "paul"} + + p2 := person(std) + s2 := student(p) + + // p2 := *(*person)(unsafe.Pointer(&std)) + // s2 := *(*student)(unsafe.Pointer(&p)) + + fmt.Printf("Type of p=%T, std=%T, p2=%T, s2=%T\n", p, std, p2, s2) +} + +func definedTypeConversion(mi myint) { + fmt.Printf("Type of mi=%T\n", mi) +} + +func takesInt(i int) { + fmt.Printf("Type of i=%T\n", i) +} + +func takesFloat(f float32) { + fmt.Printf("Type of i=%T\n", f) +} + +func takeInt8(i int8) { + fmt.Printf("Type of i=%T\n", i) +} + +func takeInt64(i int64) { + fmt.Printf("Type of i=%T\n", i) +}