2.Examples and understanding how variadic functions work
3.Slice arguments vs Variadic arguments 仅改变可变参数
4.Gotcha
二、Map
1.Create a Map
2.Retrieving value for a key from a map
3.Checking if a key exists
4.Iterate over all elements in a map
5. Deleting items from a map
6.Map of structs
7.Length of the map
8.Maps are reference types
9.Maps equality
三、Strings
1.Accessing individual bytes of a string
2.Accessing individual characters of a string
3.String length
4.String comparison
5.String concatenation
6.Strings are immutable
四、Printf的%格式化字符串
一、Variadic Functions
1.Syntax
package mainimport("fmt")funcHello(a int, b ...int){fmt.Println(a, b)// 666 [22 333 555]}funcmain(){Hello(666,22,333,555)}
2.Examples and understanding how variadic functions work
funcfind(num int, nums ...int){// 设置一个目标数字与一个 Arrays 查看当前目标数字是否在arrays里面fmt.Printf("type of nums is %T\n", nums)found :=falsefor i, v :=range nums {// 循环 Arraysif v == num {// 如果值等于 numfmt.Println(num,"found at index", i,"in", nums)found =true}}if!found {fmt.Println(num,"not find in ", nums)}fmt.Printf("\n")}funcmain(){find(89,87,90,88,89)find(45,56,67,45,90,109)find(78,38,56,98)find(87)}// type of nums is []int// 89 found at index 3 in [87 90 88 89]// 还可以这样调用nums :=[]int{89,90,95}find(89, nums)// 如果这样调用则报错 无法运行 需要添加 ... .\variadic functions. go:33:11: cannot use nums (variable of type []int) as int value in argument to findfind(89, nums...)// 89 found at index 0 in [89 90 95]
3.Slice arguments vs Variadic arguments 仅改变可变参数
funcfind(num int, nums []int){// 设置一个目标数字与一个 Arrays 查看当前目标数字是否在arrays里面fmt.Printf("type of nums is %T\n", nums)found :=falsefor i, v :=range nums {// 循环 Arraysif v == num {// 如果值等于 numfmt.Println(num,"found at index", i,"in", nums)found =true}}if!found {fmt.Println(num,"not find in ", nums)}fmt.Printf("\n")}funcmain(){find(89,[]int{87,90,88,89})find(45,[]int{56,67,45,90,109})find(78,[]int{38,56,98})find(87,[]int{})}
4.Gotcha
package mainimport("fmt")funcchange(s ...string){s[0]="Go"s =append(s,"playground")// append会创建一个新的切片fmt.Println(s)// [Go world playground]}funcmain(){welcome :=[]string{"hello","world"}change(welcome...)// change没有受到添加playground的影响 所以它的容量还是2(change操作的是原始的切片, 如果原始切片满了则会创建一个新的切片)fmt.Println(welcome)// 所以输出的是 Go world}// [Go world playground]// [Go world]// Go中的append原始切片如果没有满 则会使用原始切片不会创建新的切片 如果满了则会创建一个新的切片
二、Map
1.Create a Map
package mainimport"fmt"// create a mapfuncmain(){// example 1employeeSalary :=make(map[string]int)fmt.Println(employeeSalary)// example 2Department :=map[string]string{"Designer":"设计部","Research":"研发部",}fmt.Println(Department)// add items to mapemployeeSalary["Like"]=15000employeeSalary["Jack"]=9000employeeSalary["Lisa"]=10000fmt.Println("employeeSalary map contents:", employeeSalary)var employeeSalary map[string]intfmt.Println(employeeSalary)employeeSalary["Like"]=15000// 不可行 panic: assignment to entry in nil map}
2.Retrieving value for a key from a map
employeeSalary :=map[string]int{"steve":12000,"jamie":15000,"mike":9000,}employee :="jamie"salary := employeeSalary[employee]fmt.Println("Salary of", employee,"is", salary)// Salary of jamie is 15000fmt.Println("Salary of mike is", employeeSalary["mike"])// Salary of mike is 9000fmt.Println("Salary of joe is", employeeSalary["joe"])// Salary of joe is 0 没有则为0
3.Checking if a key exists
employeeSalary :=map[string]int{"steve":12000,"jamie":15000,"mike":9000,}newEmp :="jamie"value, ok := employeeSalary[newEmp]// 0 falsefmt.Println(value, ok)if ok ==true{fmt.Println(ok)// truefmt.Println("Salary of", newEmp,"is", value)// Salary of jamie is 15000return}fmt.Println(newEmp,"not Found")
4.Iterate over all elements in a map
employeeSalary :=map[string]int{"steve":12000,"jamie":15000,"mike":9000,}fmt.Println("Contents of the map")for key, value :=range employeeSalary {fmt.Printf("employessSalary[%s] = %d\n", key, value)}// 输出// Contents of the map//employessSalary[steve] = 12000//employessSalary[jamie] = 15000//employessSalary[mike] = 9000
5. Deleting items from a map
employeeSalary :=map[string]int{"steve":12000,"jamie":15000,"mike":9000,}fmt.Println("Contents of the map")for key, value :=range employeeSalary {fmt.Printf("employessSalary[%s] = %d\n", key, value)}// 输出// Contents of the map//employessSalary[steve] = 12000//employessSalary[jamie] = 15000//employessSalary[mike] = 9000
6.Map of structs
package mainimport("fmt")type employee struct{ salary intcountry string}funcmain(){ emp1 := employee{salary:6666, country:"Usa"}emp2 := employee{salary:7777, country:"Canada"}emp3 := employee{salary:8888, country:"China"}employeeInfo :=map[string]employee{"Steve": emp1,"Lisa": emp2,"Like": emp3,}for name, info :=range employeeInfo {fmt.Printf("Employee: %s Salary:$%d Country: %s\n", name, info.salary, info.country)}}// Employee: Lisa Salary:$7777 Country: Canada// Employee: Like Salary:$8888 Country: China// Employee: Steve Salary:$6666 Country: Usa
funccompareStrings(str1 string, str2 string){if str1 == str2 {fmt.Printf("%s and %s are equal\n", str1, str2)return}fmt.Printf("%s and %s are not equal\n", str1, str2)}string1 :="Go"string2 :="Go"compareStrings(string1, string2)string3 :="hello"string4 :="world"compareStrings(string3, string4)// Go and Go are equal// hello and world are not equal
5.String concatenation
string1 :="Go"string2 :="is awesome"//result := string1 + " " + string2result := fmt.Sprintf("%s %s", string1, string2)fmt.Println(result)// Go is awesome
6.Strings are immutable
funcmutate(s string)string{ s[0]='a'//any valid unicode character within single quote is a rune return s}funcmain(){ h :="hello"fmt.Println(mutate(h))}// 输出 cannot assign to s[0] (value of type byte)// 优化funcmutate(s []rune)string{// mutate函数接受一个[]rune类型的切片作为参数,并返回一个字符串。s[0]='a'// []rune是一个Unicode字符的切片类型。它将字符串转换为Unicode字符切片,以便我们可以修改字符串中的字符。returnstring(s)}funcmain(){ h :="hello"fmt.Println(mutate([]rune(h)))// mutate函数修改了切片中的第一个字符,将其替换为'a'。}