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