Go基础【练习版】

以下的这些操作经常在GO的基础中常用到的操作,所以必须日常不断得加以练习。

1、数据的连接与CRUD

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func init() {

}

// 插入单个值
func InsertOne() {
	statement := "Insert stu values (8,'nike')"
	result, err := db.Exec(statement)
	if err != nil {
		log.Fatalln("getOne err")
	}
	n, _ := result.RowsAffected()
	fmt.Printf("影响了%d行\n", n)
}

// 插入多个值
func InsertMany() {
	stus := [2][2]string{{"7", "小红"}, {"9", "张量"}}
	stmt, _ := db.Prepare("Insert into stu values (?,?)")
	for _, stu := range stus {
		stmt.Exec(stu[0], stu[1])
	}
}

// 删除指定值
func DeleteOne() {
	statement := "delete from stu where id=9"
	res, _ := db.Exec(statement)
	n, _ := res.RowsAffected()
	fmt.Printf("删除成功了%d行\n", n)

}

// 删除多个值
func DeleteMany() {
	statement := "delete from stu where id > 6"
	res, _ := db.Exec(statement)
	n, _ := res.RowsAffected()
	fmt.Printf("删除了%d行\n", n)
}

// 删除指定值
func DeleteWant() {
	statmt, _ := db.Prepare("delete from stu where name=(?) || name=(?)")
	res, _ := statmt.Exec("talyer", "jake")
	n, _ := res.RowsAffected()
	fmt.Printf("一共删除%d行", n)
}

// 查询单个值
func SelectOne() {
	var id, name string
	statmt := "select * from stu where id=1"
	rows := db.QueryRow(statmt)
	rows.Scan(&id, &name)
	fmt.Printf("id=%s,name=%s\n", id, name)

}

// 查询多个值
func SelectMany() {
	rows, _ := db.Query("select * from stu")
	var id, name string
	for rows.Next() {
		rows.Scan(&id, &name)
		fmt.Printf("id=%s,name=%s\n", id, name)
	}

}

// 更新单个值
func UpdateOne() {
	statmt, _ := db.Prepare("update stu set name=(?) where id=1")
	res, _ := statmt.Exec("小张")
	n, _ := res.RowsAffected()
	fmt.Printf("一共有%d条数据更新\n", n)

}

// 更新多个值
func UpdateMany() {
	state, _ := db.Prepare("update stu set name=(?) where id>(?)")
	res, _ := state.Exec("小红", 2)
	n, _ := res.RowsAffected()
	fmt.Printf("一共更新%d条\n", n)
}

func main() {
	fmt.Println("数据库连接的日常练习")
	var err error
	db, err = sql.Open("mysql", "root:!@#qwe123@(127.0.0.1:3306)/testdatabases")
	if err != nil {
		log.Fatalln("数据库驱动发生错误")
	}
	defer db.Close()
	err = db.Ping()
	if err != nil {
		log.Fatalln("连接数据库时发生错误")
	}
	fmt.Println("连接数据库成功")
	UpdateMany()
}

2、日志的使用

2.1 方式一、简单的方法

func init() {
	//设置日志开头的部分
	log.SetPrefix("DZ: ")
	//设置日志输出文件
	f, err := os.OpenFile("./dz.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatalln(err)
	}
	log.SetOutput(f)
	//设置一下具体的输出
	log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile)

}

2.2 方式二、配置错误级别

// 自定义一些错误级别
var (
	Trace   *log.Logger
	Info    *log.Logger
	Warning *log.Logger
	Error   *log.Logger
)

func init() {
	file, err := os.OpenFile("./Dz.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatal("无法打开log文件", err)
	}
	Trace = log.New(ioutil.Discard, "TRACE: ", log.Ldate|log.Ltime|log.Llongfile)
	Info = log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime|log.Llongfile)
	Warning = log.New(os.Stdout, "WARNING: ", log.Ldate|log.Ltime|log.Llongfile)
	Error = log.New(io.MultiWriter(file, os.Stderr), "ERROR: ", log.Ldate|log.Ltime|log.Llongfile)
}
func main() {
	Trace.Println(123)
	Info.Println(1234)
	Warning.Println(12345)
	Error.Println(123456)

}

3、读写文件

3.1 读取文件

func Read()  (string){
    f, err := os.Open("file/test")
    if err != nil {
        fmt.Println("read file fail", err)
        return ""
    }
    defer f.Close()

    fd, err := ioutil.ReadAll(f)
    if err != nil {
        fmt.Println("read to fd fail", err)
        return ""
    }

    return string(fd)
}

3.2 写文件

func Write(fileName,s) {
    dstFile,err := os.Create(fileName)
    if err!=nil{
        fmt.Println(err.Error())  
        return
    } 
    defer dstFile.Close()
    dstFile.WriteString(s + "\n")
}

4、常用的实现接口的操作——io.writer


func main() {
	fmt.Fprintf(MyString("./dz.log"), "%d\n", 12)
}

type MyString string

func (ms MyString) Write(data []byte) (int, error) {
	f, err := os.OpenFile(string(ms), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
	if err != nil {
		return 0, err
	}
	return f.Write(data)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值