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 \n", 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\n", s, s) //type:int value:1000
}
s2 := strconv.Itoa(s)
fmt.Printf("type:%T value:%#v\n", s2, s2)
//如果有空格的话会转换成false
str := "true "
b, _ := strconv.ParseBool(str)
fmt.Printf("type:%T value:%#v\n", b, b)
str = strings.Replace(str, " ", "", -1)
b, _ = strconv.ParseBool(str)
fmt.Printf("type:%T value:%#v\n", b, b)
}