diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..797acea
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/golang-basic/latihan/test.go b/golang-basic/latihan/test.go
deleted file mode 100644
index 06ab7d0..0000000
--- a/golang-basic/latihan/test.go
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/golang-basic/latihan/tugas1/01-arif.go b/golang-basic/latihan/tugas1/01-arif.go
new file mode 100644
index 0000000..236f7ba
--- /dev/null
+++ b/golang-basic/latihan/tugas1/01-arif.go
@@ -0,0 +1,22 @@
+package main
+
+import "fmt"
+
+func main() {
+ var kata string
+
+ fmt.Scan(&kata)
+
+ result := isPalindrome(kata)
+
+ fmt.Println(result)
+}
+
+func isPalindrome(kata string) (isPalindrome bool) {
+ for i := 0; i < len(kata)/2; i++ {
+ if kata[i] == kata[len(kata)-i-1] {
+ isPalindrome = true
+ }
+ }
+ return
+}
diff --git a/golang-basic/latihan/tugas1/01-arif_test.go b/golang-basic/latihan/tugas1/01-arif_test.go
new file mode 100644
index 0000000..8004310
--- /dev/null
+++ b/golang-basic/latihan/tugas1/01-arif_test.go
@@ -0,0 +1,42 @@
+package main
+
+import "testing"
+
+func Test_isPalindrome(t *testing.T) {
+ type args struct {
+ kata string
+ }
+ tests := []struct {
+ name string
+ args args
+ wantIsPalindrome bool
+ }{
+ {
+ name : "test",
+ args : args{
+ "katak",
+ },
+ wantIsPalindrome : true,
+ },
+ {
+ name : "test",
+ args : args{
+ "kata",
+ },
+ wantIsPalindrome : false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if gotIsPalindrome := isPalindrome(tt.args.kata); gotIsPalindrome != tt.wantIsPalindrome {
+ t.Errorf("isPalindrome() = %v, want %v", gotIsPalindrome, tt.wantIsPalindrome)
+ }
+ })
+ }
+}
+
+func BenchmarkIsPalindrome(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ isPalindrome("katak")
+ }
+}
diff --git a/golang-basic/latihan/tugas1/go.mod b/golang-basic/latihan/tugas1/go.mod
new file mode 100644
index 0000000..37bab88
--- /dev/null
+++ b/golang-basic/latihan/tugas1/go.mod
@@ -0,0 +1,3 @@
+module tugas1
+
+go 1.17
diff --git a/golang-basic/latihan/tugas2/02-arif.go b/golang-basic/latihan/tugas2/02-arif.go
new file mode 100644
index 0000000..39a8885
--- /dev/null
+++ b/golang-basic/latihan/tugas2/02-arif.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func main() {
+ var kata string
+
+ fmt.Scan(&kata)
+
+ kata2 := kata[0]
+
+ result := checkConsonant(string(kata2))
+
+ fmt.Print(result)
+}
+
+func checkConsonant(ch string) string {
+ ch = strings.ToLower(ch)
+
+ if ch == "a" || ch == "i" || ch == "u" || ch == "e" || ch == "o" {
+ return "Vokal"
+ }
+
+ return "Konsonan"
+}
+
+func checkConsonantWithPackage(input string) string {
+ vowels := "aeiou"
+
+ if strings.Contains(vowels, input) {
+ return "Vokal"
+ }
+
+ return "Konsonan"
+}
diff --git a/golang-basic/latihan/tugas2/02-arif_test.go b/golang-basic/latihan/tugas2/02-arif_test.go
new file mode 100644
index 0000000..d21dfe3
--- /dev/null
+++ b/golang-basic/latihan/tugas2/02-arif_test.go
@@ -0,0 +1,151 @@
+package main
+
+import "testing"
+
+func Test_checkConsonant(t *testing.T) {
+ type args struct {
+ ch string
+ }
+ tests := []struct {
+ name string
+ args args
+ want string
+ }{
+ {
+ name: "Test untuk konsonan",
+ args: args{
+ ch: "k",
+ },
+ want: "Konsonan",
+ },
+ {
+ name: "Test untuk konsonan 2",
+ args: args{
+ ch: "p",
+ },
+ want: "Konsonan",
+ },
+ {
+ name: "Test untuk Vokal a",
+ args: args{
+ ch: "a",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal i",
+ args: args{
+ ch: "i",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal u",
+ args: args{
+ ch: "u",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal e",
+ args: args{
+ ch: "e",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal o",
+ args: args{
+ ch: "o",
+ },
+ want: "Vokal",
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if got := checkConsonant(tt.args.ch); got != tt.want {
+ t.Errorf("checkConsonant() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}
+
+func Test_checkConsonantWithPackage(t *testing.T) {
+ type args struct {
+ input string
+ }
+ tests := []struct {
+ name string
+ args args
+ want string
+ }{
+ {
+ name: "Test untuk konsonan",
+ args: args{
+ input: "k",
+ },
+ want: "Konsonan",
+ },
+ {
+ name: "Test untuk konsonan 2",
+ args: args{
+ input: "p",
+ },
+ want: "Konsonan",
+ },
+ {
+ name: "Test untuk Vokal a",
+ args: args{
+ input: "a",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal i",
+ args: args{
+ input: "i",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal u",
+ args: args{
+ input: "u",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal e",
+ args: args{
+ input: "e",
+ },
+ want: "Vokal",
+ },
+ {
+ name: "Test untuk Vokal o",
+ args: args{
+ input: "o",
+ },
+ want: "Vokal",
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if got := checkConsonantWithPackage(tt.args.input); got != tt.want {
+ t.Errorf("checkConsonantWithPackage() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}
+
+func BenchmarkCheckConsonant(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ checkConsonant("a")
+ }
+}
+
+func BenchmarkCheckConsonantWithPackage(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ checkConsonantWithPackage("a")
+ }
+}
diff --git a/golang-basic/latihan/tugas2/go.mod b/golang-basic/latihan/tugas2/go.mod
new file mode 100644
index 0000000..3cb07f8
--- /dev/null
+++ b/golang-basic/latihan/tugas2/go.mod
@@ -0,0 +1,3 @@
+module tugas2
+
+go 1.17