Skip to content

Commit 8bc3903

Browse files
authored
Merge pull request #41 from syafiqparadisam/typeCastingWithStruct
feat: menambahkan materi 17. tipe casting with struct
2 parents c4cf3c7 + 9ef4469 commit 8bc3903

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package main
2+
3+
import "fmt"
4+
5+
// membuat structure person1 dengan field name,age,speed
6+
type Person1 struct {
7+
name string
8+
age int
9+
speed int
10+
}
11+
12+
// membuat structure person2 dengan field yang sama tetapi ada tambahan property skin
13+
type Person2 struct {
14+
name string
15+
age int
16+
speed int
17+
skin string
18+
}
19+
20+
// membuat interface human yang siapa mau mengimplementasikannya harus mempunyai method walk
21+
type Human interface {
22+
walk()
23+
}
24+
25+
// membuat method getSkin khusus untuk struct person2
26+
func (p2 *Person2) getSkin() string {
27+
return p2.skin
28+
}
29+
30+
// meingimplementasikan interface human untuk struct person2
31+
func (p2 *Person2) walk() {
32+
p2.speed++
33+
fmt.Printf("speed after walk: %d\n", p2.speed)
34+
}
35+
36+
// mengimplementasikan interface human untuk struct person1
37+
func (p1 *Person1) walk() {
38+
p1.speed++
39+
fmt.Printf("speed after walk: %d\n", p1.speed)
40+
}
41+
42+
// membuat instance human yang memiliki parameter name, age, skin lalu mereturn interface Human
43+
func NewHuman(name string, age int, skin string) Human {
44+
// pengecekan jika nilai argumen skin itu ada isinya atau tidak sama dengan "" maka kita menggunakan person2
45+
46+
if skin != "" {
47+
return &Person2{name: name, age: age, skin: skin}
48+
} else {
49+
// sedangkan jika parameter skin itu "" maka kita menggunakan structure person1
50+
return &Person1{name: name, age: age}
51+
}
52+
}
53+
54+
func main() {
55+
/*
56+
membuat instance human dengan nama = "your name", age = 20 dan skin = "white"
57+
jika kalian tidak ingin memasukkan nilai skin kalian bisa beri aja nilai ""
58+
*/
59+
human := NewHuman("your name", 20, "white")
60+
61+
/*
62+
mengkonversi dan melakukan pengecekan apakah konversi tipe interface Human ke tipe *Person1 gagal atau berhasil jika ok maka eksekusi kode if ini
63+
*/
64+
if person1, ok := human.(*Person1); ok {
65+
// print value dari person1
66+
fmt.Printf("name: %s\n age: %d\n speed: %d\n", person1.name, person1.age, person1.speed)
67+
// tampilkan speed person1 setelah walk saat ini
68+
person1.walk()
69+
}
70+
/*
71+
mengkonversi dan melakukan pengecekan apakah konversi tipe interface Human ke tipe *Person2 gagal atau berhasil jika ok maka eksekusi kode if ini
72+
*/
73+
if person2, ok := human.(*Person2); ok {
74+
// print value dari person2, disini kita bisa memakai method getSkin() dari person2, karena kita sudah mengkonversinya, jadi kita bisa akses metode tersebut
75+
fmt.Printf("name: %s\n age: %d\n speed: %d\n skin: %s\n", person2.name, person2.age, person2.speed, person2.getSkin())
76+
// tampilkan speed person2 setelah walk saat ini
77+
person2.walk()
78+
}
79+
}

0 commit comments

Comments
 (0)