3.IO

予早 2025-02-21 01:08:21
Categories: Tags:

命令交互

package main

import "fmt"

func main() {
    var age int
    n1, err1 := fmt.Scanln(&age) //12
    fmt.Println(n1, err1, age)
    var str string
    n2, err2 := fmt.Scanf("%d %s", &age, &str) //12 Jack
    fmt.Println(n2, err2, age, str)
}

文件

OS包下FIle结构体封装文件操作

打开文件

os.Open

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("./text.txt")
    if err != nil {
        fmt.Println(err)
        return
    }

    err = file.Close()
    if err != nil {
        fmt.Println(err)
        return
    }
}

os.Create

os.OpenFile

func OpenFile(name string, flag int, perm FileMode) (*File, error)

os.Open()、os.Create()都是调用的os.OpenFile()

flag可以使用|进行组合

// Flags to OpenFile wrapping those of the underlying system. Not all
// flags may be implemented on a given system.
const (
    // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
    O_RDONLY int = syscall.O_RDONLY // open the file read-only.
    O_WRONLY int = syscall.O_WRONLY // open the file write-only.
    O_RDWR   int = syscall.O_RDWR   // open the file read-write.
    // The remaining values may be or'ed in to control behavior.
    O_APPEND int = syscall.O_APPEND // append data to the file when writing.
    O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
    O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.
    O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
    O_TRUNC  int = syscall.O_TRUNC  // truncate regular writable file when opened.
)

perm是unix下的文件权限控制,windows下无效

一次性读写文件

package main

import (
    "fmt"
    "os"
)

func main() {
    filePath := "E:\\GoBaseCode\\src\\gocode\\test.txt"
    content, err := os.ReadFile(filePath)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(content)
    fmt.Printf("%s", content)

    err = os.WriteFile(filePath, append(content, "\nHello World 5"...), 0666)
    if err != nil {
        fmt.Println(err)
        return
    }
}

缓冲区读写文件

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Open("E:\\GoBaseCode\\src\\gocode\\test.txt")
    if err != nil {
        fmt.Println(err)
        panic("xxx")
    }
    defer func(file *os.File) {
        err := file.Close()
        if err != nil {
            
        }
    }(file)

    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString('\n')
        fmt.Print(str)
        if err == io.EOF {
            break
        }
    }
}
package main

import (
    "bufio"
    "os"
)

func main() {
    file, err := os.OpenFile("E:\\GoBaseCode\\src\\gocode\\test.txt", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        return
    }
    defer func(file *os.File) {
        err := file.Close()
        if err != nil {
        }
    }(file)

    writer := bufio.NewWriter(file)
    writer.WriteString("Hello World 4")
    writer.Flush() //将缓存区数据刷到磁盘
}

复制文件

io.CopyBuffer()

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)

序列化和反序列化

json

package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    //序列化的目的在于系统间传输
    //一般个系统间对于数据的存储格式是不一致的,所以需要序列化为通用数据格式
    //一般基本数据如整型、字符等基本类型各系统表示一致
    //所以最需要序列化的其实是复杂数据类型,如Go中的结构体、Java中的类

    //基本数据类型
    var num float64 = .314
    bytes, err := json.Marshal(num)
    if err != nil {
        return
    }
    fmt.Printf("%s\n", bytes)

    var num2 float64
    err2 := json.Unmarshal(bytes, &num2) //基本数据类型需要由系统开辟栈内存或者手动开辟堆内存

    var num3 *float64 = new(float64)
    json.Unmarshal(bytes, num3) //感觉有点理解指针和引用的区别了,好像还是不太一样的
    fmt.Println(*num3)

    if err != nil {
        fmt.Println(err2)
        return
    }
    println(num2)

    //结构体
    type User struct {
        Name   string `json:"name,omitempty"`
        Gender string `json:"gender,omitempty"`
        Age    int    `json:"age,omitempty"`
    }

    user := User{
        Name:   "张三",
        Gender: "男",
        Age:    18,
    }
    bytes2, err := json.Marshal(user)
    if err != nil {
        return
    }
    fmt.Printf("%s\n", bytes2)

    var user2 User
    err3 := json.Unmarshal(bytes2, &user2)
    if err3 != nil {
        return
    }
    fmt.Printf("%v\n", user2)

    //map序列化
    m := map[string]interface{}{"A": 1, "B": 2}
    bytes3, err := json.Marshal(m)
    if err != nil {
        return
    }
    fmt.Printf("%s\n", bytes3)
    var m2 map[string]interface{}
    err4 := json.Unmarshal(bytes3, &m2) //引用数据类型自动make
    if err4 != nil {
        return
    }
    fmt.Printf("%v\n", m2)

    //slice序列化
    s := []map[string]any{
        {"A": 1, "B": 2},
        {"A": 1, "B": 2},
        {"A": 1, "B": 2},
    }
    bytes4, err := json.Marshal(s)
    if err != nil {
        return
    }
    fmt.Printf("%s\n", bytes4)
    var s2 []map[string]any
    err5 := json.Unmarshal(bytes4, &s2)
    if err5 != nil {
        return
    }
    fmt.Printf("%v\n", s2)

}

xml

两个核心函数

func Marshal(v interface{}) ([]byte, error)
func Unmarshal(data []byte, v interface{}) error

两个核心结构体

type Decoder struct {
    // ...
}
type Encoder struct {
    // contains filtered or unexported fields
}