Golang语言值传递

栏目: Go · 发布时间: 7年前

内容简介://1.值传递与引用传递//2.defer关键字//3.作用域

前言:打铁要趁热,因为以前学过 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语言值传递》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Scalability for Startup Engineers

Web Scalability for Startup Engineers

Artur Ejsmont / McGraw / 2015-6-23 / USD 34.81

Design and build scalable web applications quickly This is an invaluable roadmap for meeting the rapid demand to deliver scalable applications in a startup environment. With a focus on core concept......一起来看看 《Web Scalability for Startup Engineers》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具