前言:打铁要趁热,因为以前学过java和c语言
知识点预览
//1.值传递与引用传递
//2.defer关键字
//3.作用域
//4.错误处理
//值传递有那些:基本数据类型(int,float,type,array,struct等)
//引用传递有那些:复合数据类型(指针,切片,接口等)
//1.值传递
func sum(n1,n2 int){
n1++
n2++
}
func main(){
sum(10,20)//这样做是引用传递函数内部不会修改它的值
}
//2.引用传递
func sum(*n1,*n2 int){
*n1++
*n2++
}
func main(){
num1:=10
num2:=20
sum(&num1,&num2)//这样做是值传递
}
//defer 关键字
//1.defer怎样用
func fmp(){
defer fmt.Println("defer 01")
defer fmt.Println("defer 02")
}
func main(){
fmp()
fmt.Println("defer 03")
}
/*上面程序的结果 defer 03-->defer 02 --->defer 01,defer的作用是入栈先入后出,如果在入栈后
再改变其值
不会修改到它入栈前的值,多用于连接资源用完后,清除连接等功能*/
//1.作用域的陷阱
在函数外用 Name := 18 //这种语句会报错,因为赋值只能在函数体进行
//2作用域是指在{}内有效的变量
func sum(){
var name = "zhangsan"
fmt.Println(name)
}
fmt.Println(name) //这样会报错,因为作用域不存在
//3.全局作用域和全项目作用域
var (
name = "xiaoming"
) //全局作用域,只在本包有效
var Name = "xiaoli" //全项目作用域,在所有的包有效
//个人的误区
//注:在我测试if作用域时我一直以为if是不受这个影响的但是在go中也是
//会有影响的只是我测试时候用的全局的变量所以误以为是局部的问题
/*异常处理(在我初期接触编程时候,我觉得异常处理是没有必要,但是在后面项目接触中,
发现异常是那么的重要,其实各种语言都有其内置的错误处理机制,但是不友好,
会让你的程序出现某种错误的时候停止,同时会报错到具体的服务器某某行的问题,因此对于
黑客攻击这些
信息是十分的重要,为了避免安全和程序的支行考虑,错误处理机制必不可少)
*/
//1.系统的内置错误使用
func errocatch() int {
defer func() {
err := recover()
if err != nil{
fmt.Println("err=",err)
fmt.Println("数字有误请检查")
}
}()
num1 := 10
num2 := 0
return num1/num2
}
func main(){
errocatch() //如果上面不进行异常的捕获程序就会中断无法执行了
}
//自定义的异常处理机制
//假定一个场景,在数据库查询一个值,但是用户不能传0值过来
func sqlquery(num1 int) (err error){
if(num1 == 0){
return errors.New("不能传递一个0,请重新传递")
}
}
func main(){
defer func() {
info := recover() //info := recover();等价写在if后面
if info != nil {
fmt.Println("触发了宕机", info)
} else {
fmt.Println("程序正常退出")
}
}()
err := sqlquery(0)
if err != nil{
panic(err)
/*如果使用panic不用derfer 接收错误信息,
会发生宕机现象(即后面所有的代码停止抛出错误),
因此避免错误的不可控需要recover接收错误值*/
}
fmt.Println("run other")
}
有疑问加站长微信联系(非本文作者)