美文网首页
Go 文件I/O操作

Go 文件I/O操作

作者: 如逆水行舟不进则退 | 来源:发表于2020-08-24 14:45 被阅读0次
  • error接口
package main

import (
  "errors"
  "fmt"
  "math"
  "os"
)

func main() {
  // 异常情况1
  res := math.Sqrt(-100)
  fmt.Println(res)
  res ,err := Sqrt(-100)
  if err != nil {
    fmt.Println(err)
  } else {
    fmt.Println(res)
  }
  // 异常情况2
  res,err = Divide(10,0)
  if err != nil {
    fmt.Println(err.Error())
  } else {
    fmt.Println(res)
  }
  // 异常情况3 打开不存在的文件
  f, err := os.Open("/abc.txt")
  if err != nil {
    fmt.Println(err)
  } else {
    fmt.Println(f.Name(), "该文件成功被打开")
  }

}

func Sqrt(f float64)(float64, error)  {
  if f < 0 {
    return 0, errors.New("负数不可以获取平方根")
  } else {
    return math.Sqrt(f), nil
  }
}

func Divide(dividee float64, divider float64) (float64, error) {
  if divider == 0 {
      return 0, errors.New("出错,除数不可以为0!")
  } else {
    return dividee / divider, nil
  }
}


  • 创建error 对象
package main

import (
  "errors"
  "fmt"
)

func main() {

  // 1.创建error对象的方式1
  err1 := errors.New("自己创建的错误")
  fmt.Println(err1.Error())
  fmt.Println(err1)
  fmt.Printf("err1 的类型:%T\n", err1) // *errors.errorString
  fmt.Println("--------")
  // 2.创建error对象方式2
  err2 := fmt.Errorf("错误的类型%d", 10)
  fmt.Println(err2.Error())
  fmt.Println(err2)
  fmt.Printf("err2 的类型:%T\n", err2) // *errors.errorString
  fmt.Println("--------")

  // error 对象在函数中的使用
  res, err3 := checkAge(-12)
  if err3 != nil {
    fmt.Println(err3.Error())
    fmt.Println(err3)
  } else {
    fmt.Println(res)
  }


}

// 设计一个函数验证年龄,如果是负数,则返回error
func checkAge(age int)(string,error)  {
  if age < 0 {
    err := fmt.Errorf("你输入的年龄是:%d, 该数值为负数,有错误", age)
    return "", err
  } else {
    return fmt.Sprintf("您输入的年龄是 %d", age),nil
  }
}

  • 自定义错误
package main

import (
  "fmt"
  "time"
)

// 1.定义结构体,标识自定义错误类型
type MyError struct {
  When time.Time
  What string
}
// 实现Error() 方法
func (e MyError) Error() string  {
  return fmt.Sprintf("%v : %v", e.When, e.What)
}

//3 定义函数,返回error对象。该函数求矩形面积
func getArea(width, length float64) (float64, error)  {
  errorInfo := ""
  if width < 0 && length < 0 {
    errorInfo = fmt.Sprintf("长度:%v , 宽度:%v 均为负数", length,width)
  } else if length < 0 {
    errorInfo = fmt.Sprintf("长度:%v 出现负数", length)
  } else if width < 0 {
    errorInfo = fmt.Sprintf("宽度:%v 出现负数", width)
  }

  if errorInfo != "" {
    return 0, MyError{time.Now(), errorInfo}
  } else {
    return width * length, nil
  }
}

func main() {
  res, err := getArea(-4,-5)
  if err != nil {
    fmt.Printf(err.Error())
  } else {
    fmt.Println("面积为:", res)
  }
}

  • panic 示例1
package main

import "fmt"

func TestA()  {
  fmt.Println("func TestA")
}

func TestB()  {
  panic("func TestB panic")
}

func TestC()  {
  fmt.Println("func TestC")
}
func main() {
  TestA()
  TestB() // 发生异常,中断程序
  TestC()
}

  • 内置的panic()函数引发的panic异常
package main

import "fmt"

func TestA()  {
  fmt.Println("func TestA")
}

func TestB(x int)  {
  var a [100]int
  a[x] = 1000 // x值为101时,数组越界
}

func TestC()  {
  fmt.Println("func TestC")
}
func main() {
  TestA()
  TestB(101) // 发生异常,中断程序
  TestC()
}

  • 需要注意的是,recover()让程序恢复,必须在延迟函数中执行。换言之,recover()仅在延迟函数中有效。
package main

import "fmt"

func funcA()  {
  fmt.Println("这是funcA")
}

func funcB()  {
  defer func() {
    if msg := recover(); msg != nil {
      fmt.Println("恢复啦,获取recover 的返回值:", msg)
    }
  }()
  fmt.Println("这是funcB")
  for i := 0; i<10; i++ {
    fmt.Println("i:", i)
    if i == 5 {
      panic("funcB 恐慌啦")
    }
  }
}

func funcC() {
  defer func() {
    fmt.Println("执行延迟函数")
    msg := recover()
    fmt.Println("获取recover的返回值:",msg)
  }()

  fmt.Println("这是funcC")
  panic("funcC 恐慌了")
}

func main() {
  funcA()
  funcB()
  funcC()
  fmt.Println("main over")
}

相关文章

  • Go 文件I/O操作

    error接口 创建error 对象 自定义错误 panic 示例1 内置的panic()函数引发的panic异常...

  • Go入门系列(六)I/O

    目录:一、终端I/O二、文件I/O 一、终端I/O Go语言的终端I/O操作在基础包上有封装了多种,我们以fmt包...

  • Python文件操作

    文件I/O I 输入(input) O输出(Output) 文件操作步骤:1.打开文件 2.读写文件 3...

  • 流?I/O操作?阻塞?epoll?

    一、流?I/O操作? 阻塞? (1) 流 可以进行I/O操作的内核对象 文件、管道、套接字…… 流的入口:文件描述...

  • 异步I/O—事件循环机制

    I/O简介 1.I/O操作:内核在进行文件I/O操作时,通过文件描述符(fd:一个整数—应用程序和内核之间的凭证)...

  • 17.Java中的IO

    1.I/O操作的目标 2.I/O的分类方法 3.读取文件和写入文件的方法 I/O操作的目标 从数据源当中读取数据,...

  • 协议栈学习笔记

    缓存 I/O 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linu...

  • 5-3 如何设置文件的缓冲

    实际案例: 将文件内容写入到硬件设备时,使用系统调用,这类I/O操作的时间很长.为了减少I/O操作的次数,文件通常...

  • I/O访问方式

    缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/...

  • 2.C标准I/O

    2 C 标准I/O 2.1 文件指针 标准I/O并不直接操作文件描述符,而是通过文件指针(file pointer...

网友评论

      本文标题:Go 文件I/O操作

      本文链接:https://www.haomeiwen.com/subject/mxjnjktx.html