package main import ( "fmt" "strconv" "strings" ) //函数相关 // type calculation func(int, int) int // func add(a, b int) int { // return a + b // } // func operation(a, b int, op calculation) int { // return op(a, b) // } // func main() { // scoreMap := make(map[string]int, 8) // scoreMap["cyao"] = 100 // scoreMap["test"] = 90 // fmt.Print(operation(scoreMap["cyao"], scoreMap["test"], add)) // // fmt.Printf("长度%v cap: %v ", len(scoreMap), cap(scoreMap)) // fmt.Printf("类型为: %T ", scoreMap) // } //函数闭包相关 闭包=函数+引用环境 // func adder() func(int) int { // var x int // return func(y int) int { // x += y // return x // } // } // func main() { // var f = adder() // fmt.Println(f(10)) //10 // fmt.Println(f(20)) //30 // fmt.Println(f(30)) //60 // f1 := adder() // fmt.Println(f1(40)) //40 // fmt.Println(f1(50)) //90 // } // func makeSuffixFunc(suffix string) func(string) string { // return func(name string) string { // if !strings.HasSuffix(name, suffix) { // return name + suffix // } // return name // } // } // func main() { // jpgFunc := makeSuffixFunc(".jpg") // txtFunc := makeSuffixFunc(".txt") // fmt.Println(jpgFunc("test")) //test.jpg // fmt.Println(jpgFunc("test")) //test.jpg // fmt.Println(txtFunc("test")) //test.txt // } // func calc(base int) (func(int) int, func(int) int) { // add := func(i int) int { // base += i // return base // } // sub := func(i int) int { // base -= i // return base // } // return add, sub // } // func main() { // f1, f2 := calc(10) // fmt.Println(f1(1), f2(2)) //11 9 // fmt.Println(f1(3), f2(4)) //12 8 // fmt.Println(f1(5), f2(6)) //13 7 // } //defer 语句 最后被defer的语句,最先被执行 , 在return 之前会被执行 defer 函数 匿名函数后面跟的() 是匿名函数定义的入参 // func f1() int { // x := 1 // defer func() { // x++ // }() // return x // } // func f2() (x int) { // defer func() { // x++ // }() // return 3 // } // func f3() (y int) { // defer func() { // y++ // }() // return y // } // func f4() (x int) { // defer func(x int) { // x++ // }(x) // return 9 // } // func main() { // fmt.Println(f1()) // fmt.Println(f2()) // fmt.Println(f3()) // // fmt.Println(f4()) //6 // } // func calc(index string, a, b int) int { // ret := a + b // fmt.Println(index, a, b, ret) // return ret // } // func main() { // x := 1 // y := 2 // defer calc("AA", x, calc("A", x, y)) // x = 10 // defer calc("BB", x, calc("B", x, y)) // y = 20 // } //异常捕获处理 /* 1.recover()必须搭配defer使用。 2.defer一定要在可能引发panic的语句之前定义。 */ // func funcA() { // fmt.Println("func A") // } // func funcB() { // defer func() { // err := recover() //finally // //如果程序出出现了panic错误,可以通过recover恢复过来 // if err != nil { //catch // fmt.Println("recover in B") // } // }() // panic("panic in B") //throw ex // } // func funcC() { // fmt.Println("func C") // } // func main() { // funcA() // funcB() // funcC() // } /*你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。 分配规则如下: a. 名字中每包含1个'e'或'E'分1枚金币 b. 名字中每包含1个'i'或'I'分2枚金币 c. 名字中每包含1个'o'或'O'分3枚金币 d: 名字中每包含1个'u'或'U'分4枚金币 写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?*/ //程序结构如下,请实现 ‘dispatchCoin’ 函数 // var ( // coins = 50 // users = []string{ // "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth", // } // distribution = make(map[string]int, len(users)) // ) // //根据用户名分配 不考虑不够分的情况 // func allot(name string) int { // sumCoins := 0 // for _, cha := range name { // switch cha { // case 'e', 'E': // sumCoins++ // case 'i', 'I': // sumCoins += 2 // case 'o', 'O': // sumCoins += 3 // case 'u', 'U': // sumCoins += 4 // } // } // return sumCoins // } // //循环遍历所有用户 // func dispatchCoin(users []string) int { // for i := 0; i < len(users); i++ { // allotnum := allot(users[i]) //当用户前分配的数量 // coins = coins - allotnum // distribution[users[i]] = allotnum // } // return coins // } // func main() { // left := dispatchCoin(users) // fmt.Println(distribution) // fmt.Println("剩下:", left) // } //time // func main() { // now := time.Now() // fmt.Println(now.Format("2006/01/02 15:04:05")) // eT := time.Since(now) // 从开始到当前所消耗的时间 // fmt.Println(eT.Seconds() * 1000) // } // strconv 类型转换包 strings 包 func main() { num := "1000" s, err := strconv.Atoi(num) if err != nil { fmt.Println("can't convert to int") } else { fmt.Printf("type:%T value:%#v ", s, s) //type:int value:1000 } s2 := strconv.Itoa(s) fmt.Printf("type:%T value:%#v ", s2, s2) //如果有空格的话会转换成false str := "true " b, _ := strconv.ParseBool(str) fmt.Printf("type:%T value:%#v ", b, b) str = strings.Replace(str, " ", "", -1) b, _ = strconv.ParseBool(str) fmt.Printf("type:%T value:%#v ", b, b) }