以下的这些操作经常在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)
}