总结Golang在实际开发中的常用操作,以便快速查找
主要参考The Way to Go
未完待续……
处理错误
- 包装一个错误处理函数,避免大量重复if err!=nil的判断
func checkError(err error) {
if err != nil {
panic(err)
}
}
- 使用闭包处理panic错误,对拥有同样签名的函数,比如func handler1(w http.ResponseWriter, r *http.Request) { ... },可以复用panic处理机制,
func errorHandler(fn func()) func() {
return func() {
defer func() {
if err, ok := recover().(error); ok {
log.Printf("run time panic: %v", err)
}
}()
fn()
}
}
- 完整示例如下
package main
import (
"errors"
"log"
)
func main() {
calc := errorHandler(calc)
calc()
}
func div(x, y int) (int, error) {
if y == 0 {
return 0, errors.New("divisor cannot be zero")
}
return x / y, nil
}
func calc() {
_, err := div(1, 1)
checkError(err)
_, err = div(1, 0)
checkError(err)
}
func checkError(err error) {
if err != nil {
panic(err)
}
}
func errorHandler(fn func()) func() {
return func() {
defer func() {
if err, ok := recover().(error); ok {
log.Printf("run time panic: %v", err)
}
}()
fn()
}
}
读写文件
- 逐行读文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
inputFile, inputError := os.Open("client.go")
if inputError != nil {
fmt.Println(inputError.Error())
return
}
defer inputFile.Close()
inputReader := bufio.NewReader(inputFile)
for {
inputString, readerError := inputReader.ReadString('\n') //不用区别平台,Windows上也这么写
fmt.Print(inputString)
if readerError == io.EOF {
return
}
}
}
- 一次读取文件
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("client.go")
if err != nil {
fmt.Println(err.Error())
return
}
//byte[]转string
fmt.Println(string(content))
}
- 追加写文件
package main
import (
"bufio"
"fmt"
"os"
)
func main () {
//下面的os.O_WRONLY|os.O_APPEND可以有各种组合,以实现只读、只写、追加等等不同模式
outputFile, outputError := os.OpenFile("output.txt",os.O_WRONLY|os.O_APPEND,0666)
if outputError != nil {
fmt.Printf("An error occurred with file opening or creation\n")
return
}
defer outputFile.Close()
outputWriter := bufio.NewWriter(outputFile)
outputString := "hello world!\n"
for i:=0; i<10; i++ {
//写入缓冲区
outputWriter.WriteString(outputString)
}
//真正写入文件
outputWriter.Flush()
}
- 一次性写文件
package main
import (
"fmt"
"io/ioutil"
)
func main() {
buf := []byte("hello world")
err := ioutil.WriteFile("output.txt", buf, 0644) //注意这里是8进制
if err != nil {
fmt.Print(err.Error())
}
}
处理文件路径
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
path := "/home/hello/test.txt"
fmt.Println("父目录", filepath.Dir(path))
fmt.Println("文件名", filepath.Base(path))
fmt.Println("拼接路径", filepath.Join(filepath.Dir(path), "hello.txt"))
currentDir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
fmt.Println("当前文件的绝对路径", currentDir)
pwd, _ := os.Getwd()
fmt.Println("当前工作路径", pwd)
}
处理字符串
处理http请求
发送http请求
日志打印
操作数据库
处理json
有疑问加站长微信联系(非本文作者)