Golang语言值传递

江世文 · · 928 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言:打铁要趁热,因为以前学过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")
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:江世文

查看原文:Golang语言值传递

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

928 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传