diff --git a/chapter_04/activity_4.02/main.go b/chapter_04/activity_4.02/main.go new file mode 100644 index 0000000..9a4b619 --- /dev/null +++ b/chapter_04/activity_4.02/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "os" +) + +func getPassedArgs() string { + + if len(os.Args) != 2 { + fmt.Printf("Exactly 1 argument is needed\n") + os.Exit(1) + } + + return os.Args[1] + +} + +func main() { + + m := map[string]string{ + "305": "Sue", + "204": "Bob", + "631": "Jake", + "073": "Tracy", + } + + key := getPassedArgs() + if name := m[key]; name != "" { + fmt.Println("Hi,", name) + } else { + fmt.Println(key, "not found") + os.Exit(1) + } + +} diff --git a/chapter_04/activity_4.03/main.go b/chapter_04/activity_4.03/main.go new file mode 100644 index 0000000..e3ed249 --- /dev/null +++ b/chapter_04/activity_4.03/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "fmt" + "os" + "strings" +) + +type locale struct { + language string + region string +} + +func getLocales() map[locale]struct{} { + + supportedLocales := make(map[locale]struct{}, 5) + supportedLocales[locale{"en", "US"}] = struct{}{} + supportedLocales[locale{"en", "CN"}] = struct{}{} + supportedLocales[locale{"fr", "CN"}] = struct{}{} + supportedLocales[locale{"fr", "FR"}] = struct{}{} + supportedLocales[locale{"ru", "RU"}] = struct{}{} + return supportedLocales + +} + +func localExists(l locale) bool { + + _, exists := getLocales()[l] + return exists + +} + +func main() { + + if len(os.Args) != 2 { + fmt.Println("No locale passed") + os.Exit(1) + } + + localeParts := strings.Split(os.Args[1], "_") + if len(localeParts) != 2 { + fmt.Printf("Invalid locale passed: %v\n", os.Args[1]) + os.Exit(1) + } + + passedLocale := locale{ + language: localeParts[0], + region: localeParts[1], + } + + if !localExists(passedLocale) { + fmt.Printf("Locale not supported: %v\n", os.Args[1]) + os.Exit(1) + } + fmt.Println("Locale passed is supported") + +} diff --git a/chapter_04/exercise_4.08/main.go b/chapter_04/exercise_4.08/main.go new file mode 100644 index 0000000..d40a749 --- /dev/null +++ b/chapter_04/exercise_4.08/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "os" +) + +func getPassedArgs(minArgs int) []string { + + if len(os.Args) < minArgs { + fmt.Printf("At least %v arguments are needed\n", minArgs) + os.Exit(1) + } + + var args []string + for i := 1; i < len(os.Args); i++ { + args = append(args, os.Args[i]) + } + + return args + +} + +func findLongest(args []string) string { + + var longest string + for i := 0; i < len(args); i++ { + if len(args[i]) > len(longest) { + longest = args[i] + } + } + + return longest + +} + +func main() { + + if longest := findLongest(getPassedArgs(3)); len(longest) > 0 { + fmt.Println("The longest word passed was:", longest) + } else { + fmt.Println("There was an error") + os.Exit(1) + } + +} diff --git a/chapter_04/exercise_4.09/main.go b/chapter_04/exercise_4.09/main.go new file mode 100644 index 0000000..4a28675 --- /dev/null +++ b/chapter_04/exercise_4.09/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "os" +) + +func getPassedArgs() []string { + + var args []string + for i := 1; i < len(os.Args); i++ { + args = append(args, os.Args[i]) + } + + return args + +} + +func getLocals(extraLocals []string) []string { + + var locales []string + locales = append(locales, "en_US", "fr_FR") + locales = append(locales, extraLocals...) + return locales + +} + +func main() { + + locales := getLocals(getPassedArgs()) + fmt.Println("Locales to use:", locales) + +} diff --git a/chapter_04/exercise_4.10/main.go b/chapter_04/exercise_4.10/main.go new file mode 100644 index 0000000..5afcd5c --- /dev/null +++ b/chapter_04/exercise_4.10/main.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +func message() string { + + s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} + m := fmt.Sprintln("First: ", s[0], s[0:1], s[:1]) + m += fmt.Sprintln("Last: ", s[len(s)-1], s[len(s)-1:len(s)], s[len(s)-1:]) + m += fmt.Sprintln("First 5: ", s[:5]) + m += fmt.Sprintln("Last 4: ", s[len(s)-4:]) + m += fmt.Sprintln("Middle 5:", s[2:7]) + return m + +} + +func main() { + + fmt.Print(message()) + +} diff --git a/chapter_04/exercise_4.11/main.go b/chapter_04/exercise_4.11/main.go new file mode 100644 index 0000000..bd95198 --- /dev/null +++ b/chapter_04/exercise_4.11/main.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +func genSlices() ([]int, []int, []int) { + + var s1 []int + s2 := make([]int, 10) + s3 := make([]int, 10, 50) + return s1, s2, s3 + +} + +func main() { + + s1, s2, s3 := genSlices() + fmt.Printf("s1: len = %v cap = %v\n", len(s1), cap(s1)) + fmt.Printf("s2: len = %v cap = %v\n", len(s2), cap(s2)) + fmt.Printf("s3: len = %v cap = %v\n", len(s3), cap(s3)) + +} diff --git a/chapter_04/exercise_4.12/main.go b/chapter_04/exercise_4.12/main.go new file mode 100644 index 0000000..430f33b --- /dev/null +++ b/chapter_04/exercise_4.12/main.go @@ -0,0 +1,82 @@ +package main + +import "fmt" + +func linked() (int, int, int) { + + s1 := []int{1, 2, 3, 4, 5} + s2 := s1 + s3 := s1[:] + s1[3] = 99 + return s1[3], s2[3], s3[3] + +} + +func noLink() (int, int) { + + s1 := []int{1, 2, 3, 4, 5} + s2 := s1 + s1 = append(s1, 6) + s1[3] = 99 + return s1[3], s2[3] + +} + +func capLinked() (int, int) { + + s1 := make([]int, 5, 10) + s1[0], s1[1], s1[2], s1[3], s1[4] = 1, 2, 3, 4, 5 + s2 := s1 + s1 = append(s1, 6) + s1[3] = 99 + return s1[3], s2[3] + +} + +func capNoLink() (int, int) { + + s1 := make([]int, 5, 10) + s1[0], s1[1], s1[2], s1[3], s1[4] = 1, 2, 3, 4, 5 + s2 := s1 + s1 = append(s1, []int{10: 11}...) + s1[3] = 99 + return s1[3], s2[3] + +} + +func copyNoLink() (int, int, int) { + + s1 := []int{1, 2, 3, 4, 5} + s2 := make([]int, len(s1)) + copied := copy(s2, s1) + s1[3] = 99 + return s1[3], s2[3], copied + +} + +func appendNoLink() (int, int) { + + s1 := []int{1, 2, 3, 4, 5} + s2 := append([]int{}, s1...) + s1[3] = 99 + return s1[3], s2[3] + +} + +func main() { + + l1, l2, l3 := linked() + fmt.Println("Linked: ", l1, l2, l3) + nl1, nl2 := noLink() + fmt.Println("No Link: ", nl1, nl2) + cl1, cl2 := capLinked() + fmt.Println("Cap Linked: ", cl1, cl2) + cn1, cn2 := capNoLink() + fmt.Println("Cap no Link: ", cn1, cn2) + copy1, copy2, copied := copyNoLink() + fmt.Print("Copy No Link: ", copy1, copy2) + fmt.Printf(" (Number of elements copied: %v\n", copied) + a1, a2 := appendNoLink() + fmt.Println("Append No Link: ", a1, a2) + +}