1. package main
    2. import "fmt"
    3. //求两个数的和
    4. func sumFn(x int, y int) int {
    5. sum := x + y
    6. return sum
    7. }
    8. //求两个数的差
    9. func subFn(x int, y int) int {
    10. fmt.Println(x, y) //20 2
    11. sub := x - y
    12. return sub
    13. }
    14. //函数参数的简写
    15. func subFn1(x, y int) int {
    16. sub := x - y
    17. return sub
    18. }
    19. //函数的可变参数,可变参数是指函数的参数数量不固定。Go 语言中的可变参数通过在参数名后加...来标识
    20. func sumFn1(x ...int) int {
    21. // fmt.Printf("%v--%T", x, x) //[12 34 45 46]--[]int
    22. sum := 0
    23. for _, v := range x {
    24. sum += v
    25. }
    26. return sum
    27. }
    28. func sumFn2(x int, y ...int) int {
    29. fmt.Println(x, y) //100 [1 2 3 4]
    30. sum := x
    31. for _, v := range y {
    32. sum += v
    33. }
    34. return sum
    35. }
    36. func main() {
    37. // sum1 := sumFn(12, 3)
    38. // fmt.Println(sum1) //15
    39. // sum2 := sumFn(15, 5)
    40. // fmt.Println(sum2) //20
    41. // a := 20
    42. // b := 2
    43. // sub1 := subFn(a, b)
    44. // fmt.Println(sub1)
    45. // sub2 := subFn1(22, 4)
    46. // fmt.Println(sub2) //18
    47. // sum3 := sumFn1(12, 34, 45, 46) //137
    48. // fmt.Println(sum3)
    49. // sum4 := sumFn1(1, 2, 3, 4, 5) //15
    50. // fmt.Println(sum4)
    51. sum5 := sumFn2(100, 1, 2, 3, 4)
    52. fmt.Println(sum5)
    53. }
    1. package main
    2. import "fmt"
    3. //int类型升序排序
    4. func sortIntAsc(slice []int) []int {
    5. for i := 0; i < len(slice); i++ {
    6. for j := i + 1; j < len(slice); j++ {
    7. if slice[i] > slice[j] {
    8. temp := slice[i]
    9. slice[i] = slice[j]
    10. slice[j] = temp
    11. }
    12. }
    13. }
    14. return slice
    15. }
    16. //int类型降序排序 切片是引用数据类型
    17. func sortIntDesc(slice []int) {
    18. for i := 0; i < len(slice); i++ {
    19. for j := i + 1; j < len(slice); j++ {
    20. if slice[i] < slice[j] {
    21. temp := slice[i]
    22. slice[i] = slice[j]
    23. slice[j] = temp
    24. }
    25. }
    26. }
    27. }
    28. func main() {
    29. //案例1:把前面讲的选择排序封装成方法,实现整型切片的升序降序排序排列
    30. // var sliceA = []int{12, 34, 37, 35, 556, 36, 2}
    31. // arr := sortIntAsc(sliceA)
    32. // fmt.Println(arr)
    33. // var sliceB = []int{1, 34, 4, 35, 6, 36, 2}
    34. // fmt.Println(sortIntAsc(sliceB))
    35. var sliceC = []int{1, 34, 4, 36, 126, 36, 2}
    36. sortIntDesc(sliceC)
    37. fmt.Println(sliceC)
    38. }
    1. package main
    2. import (
    3. "fmt"
    4. "sort"
    5. )
    6. func mapSort(map1 map[string]string) string {
    7. var sliceKey []string
    8. //1、把map对象的key放在一个切片里面
    9. for k, _ := range map1 {
    10. sliceKey = append(sliceKey, k)
    11. }
    12. //2、对key进行升序排序
    13. sort.Strings(sliceKey)
    14. var str string
    15. for _, v := range sliceKey {
    16. str += fmt.Sprintf("%v=>%v", v, map1[v])
    17. }
    18. return str
    19. }
    20. func main() {
    21. /*
    22. 案例2:
    23. m1 := map[string]string{
    24. "username":"zhangsan",
    25. "age":"20",
    26. "sex":"男",
    27. "height":"180",
    28. }
    29. 输出:age=>20height=>180sex=>男username=>zhangsan
    30. 上面有一个map对象m1,封装一个方法,要求按照key升序排序,最后输出一个key=>valuekey=>value的字符串
    31. */
    32. m1 := map[string]string{
    33. "username": "zhangsan",
    34. "age": "20",
    35. "sex": "男",
    36. "height": "180",
    37. "salt": "xxxxxx",
    38. }
    39. str := mapSort(m1)
    40. fmt.Println(str)
    41. }
    1. package main
    2. import "fmt"
    3. var a = "全局变量"
    4. func run() {
    5. var b = "局部变量"
    6. fmt.Println("run方法a=", a)
    7. fmt.Println("run方法b=", b)
    8. fmt.Println("run")
    9. }
    10. func main() {
    11. /*
    12. 函数变量作用域:
    13. 全局变量:全局变量是定义在函数外部的变量,它在程序整个运行周期内都有效 (全局作用域)
    14. 局部变量:局部变量是函数内部定义的变量, 函数内定义的变量无法在该函数外使用 (局部作用域)
    15. */
    16. fmt.Println("main方法a=", a)
    17. // fmt.Println("main方法b=", b) //undefined: b
    18. run()
    19. //i就是局部变量 只能在for方法体内使用
    20. for i := 0; i < 10; i++ {
    21. fmt.Println(i)
    22. }
    23. // fmt.Println(i) undefined: i
    24. //在本作用域相当于全局变量
    25. // var flag = true
    26. // if flag {
    27. // fmt.Println("true")
    28. // }
    29. //flag块作用域 局部变量
    30. if flag := true; flag {
    31. fmt.Println("true")
    32. }
    33. // fmt.Println(flag) //undefined: flag
    34. }
    1. package main
    2. import "fmt"
    3. type calc func(int, int) int //表示定义一个calc的类型
    4. type myInt int
    5. func add(x, y int) int {
    6. return x + y
    7. }
    8. func sub(x, y int) int {
    9. return x - y
    10. }
    11. func test() {
    12. fmt.Println("test...")
    13. }
    14. func main() {
    15. // var c calc
    16. // c = sub
    17. // fmt.Printf("c的类型:%T\n", c) //c的类型:main.calc
    18. // fmt.Println(c(10, 5)) //5
    19. // f := sub
    20. // fmt.Printf("c的类型:%T\n", f) //c的类型:func(int, int) int
    21. // fmt.Println(f(15, 5)) //10
    22. var a int = 10
    23. var b myInt = 20
    24. fmt.Printf("a的类型:%T b的类型:%T\n", a, b) //a的类型:int b的类型:main.myInt
    25. fmt.Println(a + int(b)) //30
    26. }
    1. package main
    2. import "fmt"
    3. //函数作为另一个函数参数
    4. func add(x, y int) int {
    5. return x + y
    6. }
    7. func sub(x, y int) int {
    8. return x - y
    9. }
    10. //自定义一个方法类型
    11. type calcType func(int, int) int
    12. func calc(x, y int, cb calcType) int {
    13. return cb(x, y)
    14. }
    15. func main() {
    16. // sum := calc(10, 5, add)
    17. // fmt.Println(sum) //15
    18. // s := calc(10, 5, sub)
    19. // fmt.Println(s) //5
    20. j := calc(3, 4, func(x, y int) int {
    21. return x * y
    22. })
    23. fmt.Println(j) //12
    24. }
    1. package main
    2. import "fmt"
    3. //函数作为返回值
    4. func add(x, y int) int {
    5. return x + y
    6. }
    7. func sub(x, y int) int {
    8. return x - y
    9. }
    10. //定义一个方法类型
    11. type calcType func(int, int) int
    12. func do(o string) calcType {
    13. switch o {
    14. case "+":
    15. return add
    16. case "-":
    17. return sub
    18. case "*":
    19. return func(x, y int) int {
    20. return x * y
    21. }
    22. default:
    23. return nil
    24. }
    25. }
    26. func main() {
    27. // var a = do("+")
    28. // fmt.Println(a(12, 4)) //16
    29. b := do("*")
    30. fmt.Println(b(3, 4)) //12
    31. }
    1. package main
    2. import "fmt"
    3. func main() {
    4. //匿名函数 匿名自执行函数
    5. func() {
    6. fmt.Println("test..")
    7. }()
    8. //匿名函数
    9. var fn = func(x, y int) int {
    10. return x * y
    11. }
    12. fmt.Println(fn(2, 3))
    13. // 匿名自执行函数接收参数
    14. func(x, y int) {
    15. fmt.Println(x + y)
    16. }(10, 20)
    17. }
    1. package main
    2. import "fmt"
    3. //函数的递归调用:传入1个整数,递归打印出1-到这个数之内的所有整数
    4. func fn1(n int) {
    5. if n > 0 {
    6. fmt.Println(n)
    7. n--
    8. fn1(n)
    9. }
    10. }
    11. //递归实现1-100的和
    12. func fn2(n int) int {
    13. if n > 1 {
    14. return n + fn2(n-1)
    15. } else {
    16. return 1
    17. }
    18. }
    19. //递归实现5的阶乘
    20. func fn3(n int) int {
    21. if n > 1 {
    22. return n * fn3(n-1)
    23. } else {
    24. return 1
    25. }
    26. }
    27. //函数的递归调用
    28. func main() {
    29. //1、for循环实现1到100的和
    30. var sum = 0
    31. for i := 1; i <= 100; i++ {
    32. sum += i
    33. }
    34. fmt.Println(sum) //5050
    35. //2、传入1个整数,递归打印出1-到这个数之内的所有整数
    36. // fn1(5)
    37. //3、递归实现1-100的和
    38. // fmt.Println(fn2(100)) //5050
    39. //4、递归实现5的阶乘
    40. fmt.Println(fn3(5)) //120
    41. }
    1. package main
    2. import "fmt"
    3. //golang 闭包
    4. /*
    5. 全局变量特点:
    6. 1、常驻内存
    7. 2、污染全局
    8. 局部变量的特点:
    9. 1、不常驻内存
    10. 2、不污染全局
    11. 闭包:
    12. 1、可以让一个变量常驻内存
    13. 2、可以让一个变量不污染全局
    14. */
    15. /*
    16. 闭包
    17. 1、闭包是指有权访问另一个函数作用域中的变量的函数。
    18. 2、创建闭包的常见的方式就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。
    19. 注意:由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更
    20. 多的内存。过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。
    21. */
    22. //写法:闭包的写法 函数里面嵌套一个函数 最后返回里面的函数
    23. func adder1() func() int {
    24. var i = 10
    25. return func() int {
    26. return i + 1
    27. }
    28. }
    29. func adder2() func(int) int {
    30. var i = 10 //常驻内存 、不污染全局
    31. return func(y int) int {
    32. i += y
    33. return i
    34. }
    35. }
    36. func main() {
    37. var fn = adder1() //表示执行方法
    38. fmt.Println(fn()) //11
    39. fmt.Println(fn()) //11
    40. fmt.Println(fn()) //11
    41. var fn2 = adder2() //表示执行方法
    42. fmt.Println(fn2(10)) //20
    43. fmt.Println(fn2(10)) //30
    44. fmt.Println(fn2(10)) //40
    45. }
    1. package main
    2. import "fmt"
    3. /*
    4. Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
    5. */
    6. func f1() {
    7. fmt.Println("开始")
    8. defer func() {
    9. fmt.Println("aaaa")
    10. fmt.Println("bbbb")
    11. }()
    12. fmt.Println("结束")
    13. }
    14. // 调用方法返回的是0 fmt.Println(f2()) //0
    15. func f2() int {
    16. var a int //0
    17. defer func() {
    18. a++
    19. }()
    20. // fmt.Println("结束")
    21. return a
    22. }
    23. func f3() (a int) {
    24. defer func() {
    25. a++
    26. }()
    27. return a
    28. }
    29. func main() {
    30. //1、defer的使用演示
    31. // fmt.Println("开始")
    32. // defer fmt.Println(1)
    33. // defer fmt.Println(2)
    34. // defer fmt.Println(3)
    35. // fmt.Println("结束")
    36. //2、defer在命名返回值和匿名返回 函数中表现不一样
    37. // f1()
    38. fmt.Println(f2()) //0
    39. fmt.Println(f3()) //1
    40. }
    1. package main
    2. import "fmt"
    3. /*
    4. Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
    5. */
    6. func f1() int {
    7. x := 5
    8. defer func() {
    9. x++
    10. }()
    11. return x //5
    12. }
    13. func f2() (x int) {
    14. defer func() {
    15. x++
    16. }()
    17. return 5 //6
    18. }
    19. func f3() (y int) {
    20. x := 5
    21. defer func() {
    22. x++
    23. }()
    24. return x //5
    25. }
    26. func f4() (x int) {
    27. defer func(x int) {
    28. //x=0
    29. // fmt.Println(x)
    30. x++
    31. }(x) //defer注册要延迟执行的函数时该函数所有的参数都需要确定其值
    32. // fmt.Println("a=", x)
    33. return 5 //5
    34. }
    35. func main() {
    36. fmt.Println(f1())
    37. fmt.Println(f2())
    38. fmt.Println(f3())
    39. fmt.Println(f4())
    40. }
    1. package main
    2. import "fmt"
    3. /*
    4. Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
    5. 问,上面代码的输出结果是?
    6. 提示:defer注册要延迟执行的函数时该函数所有的参数都需要确定其值
    7. */
    8. func calc(index string, a, b int) int {
    9. ret := a + b
    10. fmt.Println(index, a, b, ret)
    11. return ret
    12. }
    13. func main() {
    14. x := 1
    15. y := 2
    16. defer calc("AA", x, calc("A", x, y))
    17. x = 10
    18. defer calc("BB", x, calc("B", x, y))
    19. y = 20
    20. }
    21. /*
    22. 注册顺序
    23. defer calc("AA", x, calc("A", x, y))
    24. defer calc("BB", x, calc("B", x, y))
    25. 执行顺序
    26. 1、defer calc("BB", x, calc("B", x, y))
    27. 2、defer calc("AA", x, calc("A", x, y))
    28. */
    29. //1、calc("A", x, y) A 1 2 3
    30. //2、calc("B", x, y) B 10 2 12
    31. //3、calc("BB", x, calc("B", x, y)) BB 10 12 22
    32. //4、calc("AA", x, calc("A", x, y)) AA 1 3 4
    1. package main
    2. import "fmt"
    3. /*
    4. panic/recover
    5. Go 语言中目前(Go1.12)是没有异常机制,但是使用 panic/recover 模式来处理错误。
    6. panic 可以在任何地方引发,但 recover 只有在 defer 调用的函数中有效
    7. */
    8. func fn1() {
    9. fmt.Println("fn1")
    10. }
    11. func fn2() {
    12. defer func() {
    13. err := recover()
    14. if err != nil {
    15. fmt.Println("err:", err)
    16. }
    17. }()
    18. panic("抛出一个异常")
    19. }
    20. func main() {
    21. fn1()
    22. fn2()
    23. fmt.Println("结束")
    24. }
    1. package main
    2. import "fmt"
    3. /*
    4. panic/recover
    5. Go 语言中目前(Go1.12)是没有异常机制,但是使用 panic/recover 模式来处理错误。
    6. panic 可以在任何地方引发,但 recover 只有在 defer 调用的函数中有效
    7. */
    8. func fn1(a int,b int) {
    9. defer func () {
    10. err := recover()
    11. if err!=nil {
    12. fmt.Println("error:",err) //error: runtime error: integer divide by zero
    13. }
    14. }()
    15. fmt.Println(a/b)
    16. }
    17. func main() {
    18. fn1(10,0)
    19. fmt.Println("结束")
    20. fn1(10,2)
    21. }
    1. /*
    2. 大地老师专栏:https://www.itying.com/category-79-b0.html
    3. Golang仿小米商城项目实战视频教程地址:https://www.itying.com/goods-1143.html
    4. */
    5. package main
    6. import (
    7. "errors"
    8. "fmt"
    9. )
    10. /*
    11. panic/recover
    12. Go 语言中目前(Go1.12)是没有异常机制,但是使用 panic/recover 模式来处理错误。
    13. panic 可以在任何地方引发,但 recover 只有在 defer 调用的函数中有效
    14. */
    15. // 模拟了一个读取文件的方法
    16. func readFile(fileName string) error {
    17. if fileName == "main.go" {
    18. return nil
    19. } else {
    20. return errors.New("读取文件失败")
    21. }
    22. }
    23. func myFn() {
    24. defer func() {
    25. err := recover()
    26. if err != nil {
    27. fmt.Println("给管理员发送邮件")
    28. }
    29. }()
    30. err := readFile("main.go")
    31. if err != nil {
    32. panic(err)
    33. }
    34. }
    35. func main() {
    36. myFn()
    37. fmt.Println("继续执行...")
    38. }