package main
import "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 main
import "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 main
import (
"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 main
import "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 main
import "fmt"
type calc func(int, int) int //表示定义一个calc的类型
type myInt int
func 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 main
import "fmt"
//函数作为另一个函数参数
func add(x, y int) int {
return x + y
}
func sub(x, y int) int {
return x - y
}
//自定义一个方法类型
type calcType func(int, int) int
func 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 main
import "fmt"
//函数作为返回值
func add(x, y int) int {
return x + y
}
func sub(x, y int) int {
return x - y
}
//定义一个方法类型
type calcType func(int, int) int
func 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 main
import "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 main
import "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 main
import "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 main
import "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()) //0
func 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 main
import "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 main
import "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 main
import "fmt"
/*
panic/recover
Go 语言中目前(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 main
import "fmt"
/*
panic/recover
Go 语言中目前(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 main
import (
"errors"
"fmt"
)
/*
panic/recover
Go 语言中目前(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("继续执行...")
}