go基本程序詳解?在Go語言中,文件操作的大多數函數都在os包裡面,文件的信息包括文件名、文件大小、修改權限、修改時間等,現在小編就來說說關于go基本程序詳解?下面内容希望能幫助到你,我們來一起看看吧!
在Go語言中,文件操作的大多數函數都在os包裡面,文件的信息包括文件名、文件大小、修改權限、修改時間等。
1.1 文件接口屬性(fileInfo)
type FileInfo interface {
Name() string // 文件名
Size() int64 // 文件大小
Mode() FileMode // 修改權限
ModTime() time.Time // 最後修改時間
IsDir() bool // 判斷是否是目錄
Sys() interface{} // 文件的詳細信息,獲取的值是*syscall.Stat_t類型
}
type fileStat struct {
name string
size int64
mode FileMode
modTime time.Time
sys syscall.Stat_t
}
方法名 描述 Name() string 返回文件名 IsDir() bool 判斷是否是目錄 Size() int64 返回文件大小 Mode() FileMode 返回文件權限 ModTime() time.Time 文件的最後修改時間 Sys() interface{} 文件的詳細信息,獲取的值是*syscall.Stat_t類型
2.使用示例
package main
import (
"fmt"
"os"
)
func main(){
fp := "./public/test1.txt"
fileInfo, err := os.Stat(fp)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("類型: %T\n",fileInfo)
fmt.Printf("文件名: %v\n",fileInfo.Name())
fmt.Printf("文件大小: %v\n",fileInfo.Size())
fmt.Printf("是否為目錄: %v\n",fileInfo.IsDir())
fmt.Printf("文件權限: %v\n",fileInfo.Mode())
fmt.Printf("文件最後修改的時間: %v\n",fileInfo.ModTime())
}
/**輸出
類型: *os.fileStat
文件名: test1.txt
文件大小: 11
是否為目錄: false
文件權限: -rw-r--r--
文件最後修改的時間: 2021-01-15 16:29:53.816034553 0800 CST
sys: &{Dev:16777220 Mode:33188 Nlink:1 Ino:15440327 Uid:501 Gid:20 Rdev:0 Pad_cgo_0:[0 0 0 0] Atimespec:{Sec:1610699394 Nsec:591237565} Mtimespec:{Sec:1610699393 Nsec:816034553} Ctimespec:{Sec:1610699393 Nsec:816034553} Birthtimespec:{Sec:1610611801 Nsec:544367649} Size:11 Blocks:8 Blksize:4096 Flags:0 Gen:0 Lspare:0 Qspare:[0 0]}
*/
方法的所屬包: path/filepath
方法名 描述 Isabs(path string) bool 判斷是否是絕對路徑 rel(basepath, targpath string) (string, error) 返回一個相對于basepath的路徑 Abs(path string) (string, error) 返回絕對路徑 Join(elem ...string) string 拼接路徑
2.2 使用示例
package main
import (
"fmt"
"path"
"path/filepath"
)
func main(){
basePath := "/Users/hui/Project/Go/src/study"
fp1 := "./public/test1.txt"
fp2 := "/Users/hui/Project/Go/src/study/public/static/test2.txt"
fmt.Printf("是絕對路徑?: %t\n",filepath.IsAbs(fp1))
// 相對路徑
rel, err := filepath.Rel(basePath, fp2)
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("fp1相對fp2的路徑?: %v\n",rel)
// 絕對路徑
abs, err := filepath.Abs(fp1)
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("fp1的絕對路徑?: %s\n",abs)
// 拼接路徑
fmt.Printf("拼接路徑1: %s \n",path.Join("/home/Item","go","study"))
fmt.Printf("拼接路徑2: %s \n",path.Join("/home/圖片","美女","beauty.jpg"))
}
/** 輸出
是絕對路徑?: false
fp1相對fp2的路徑?: public/static/test2.txt
fp1的絕對路徑?: /Users/hui/Project/Go/src/study/public/test1.txt
拼接路徑1: /home/Item/go/study
拼接路徑2: /home/圖片/美女/beauty.jpg
*/
方法 描述 os.Mkdir(name string, perm FileMode) error 創建名稱為name的目錄,權限設置是perm os.MkdirAll(path string, perm FileMode) error 根據path創建多級子目錄
2.使用示例
package main
import (
"fmt"
"os"
)
func main(){
dirName := "./img"
// 創建目錄,并分配權限
err := os.Mkdir(dirName, os.ModePerm)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println( dirName " 創建成功!")
// 創建多級目錄
dirName2 := "./public/static/css"
err = os.MkdirAll(dirName2,os.ModePerm)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println( dirName2 " 創建成功!")
}
// 判斷文件或者目錄是否存在
func pathIsExist(pathName string) (bool,error) {
// 獲取文件或目錄信息
_, err := os.Stat(pathName)
// 如果文件或目錄存在,則err== nil
if err == nil {
return true, nil
}
// 使用os.IsNotExist()判斷返回的錯誤類型是否為true,true:說明文件或文件夾不存在
if os.IsNotExist(err) {
return false,nil
}
// 如果錯誤類型為其它,則不确定是否在存在
return false,err
}
方法 描述 os.Remove(name string) error 删除名稱為name的目錄,當目錄下有文件或者其他目錄會出錯 os.RemoveAll(path string) error 根據path删除多級子目錄
2.使用示例
package main
import (
"fmt"
"os"
)
func main(){
// 删除目錄
err := os.Remove("./file")
if err != nil {
fmt.Println("Remove-> 删除失敗: " err.Error())
} else {
fmt.Println("Remove-> 删除成功!" )
}
// 删除多級子目錄
err2 := os.RemoveAll("./file/static")
if err2 != nil {
fmt.Println("RemoveAll-> 删除失敗: " err2.Error())
} else {
fmt.Println("RemoveAll-> 删除成功!" )
}
}
os.Create()創建文件,如果文件存在,會将其覆蓋。os.Create()本質上調用的是OpenFile,源碼如下:
func Create(name string) (*File, error) {
return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
package main
import (
"fmt"
"os"
)
func main(){
fileName := "./file/a.txt"
//如果文件存在,則會覆蓋
create, err := os.Create(fileName)
if err != nil {
fmt.Println("創建失敗: " err.Error())
return
}
fmt.Printf("創建成功! %v\n",create)
}
方法名 描述 Open(name string) (*File, error) 隻讀模式打開文件,本質上調用的是OpenFile OpenFile(name string, flag int, perm FileMode) (*File, error) 打開文件,可以傳入模式和權限
2.OpenFile入參介紹flag值 代表的模式 O_RDONLY 隻讀模式 O_WRONLY 隻寫模式 O_RDWR 讀寫模式 O_APPEND 追加模式 O_CREATE 文件不存在,則創建 O_EXCL 和O_CREATE配合使用,文件必須不存在 O_SYNC 打開文件用于同步I/O O_TRUNC 如果可能,打開時清空文件
3.使用示例
package main
import (
"fmt"
"os"
)
func main(){
// 該文件不存在
fileName := "./public/test.txt"
file1, err := os.Open(fileName)
if err != nil {
fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error())
} else {
fmt.Printf("os.Open 打開文件成功,open:%v \n" , file1)
// 關閉文件
defer file1.Close()
}
// 文件不存在,則會創建文件
file2, err1 := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)
if err1 != nil {
fmt.Printf("os.OpenFile 打開文件失敗,err:%s \n" , err1.Error())
} else {
fmt.Printf("os.OpenFile 打開文件成功,open:%v \n" , file2)
// 關閉文件
defer file2.Close()
}
}
/**輸出
os.Open 打開文件失敗,err:open ./public/test.txt: no such file or directory
os.OpenFile 打開文件成功,open:&{0xc0000b0120}
*/
讀取文件步驟: 打開文件(Open) 、讀取文件(Read)、關閉文件(Close)
package main
import (
"fmt"
"os"
)
func main(){
fileName := "./public/test.txt"
file1, err := os.Open(fileName)
if err != nil {
fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error())
return
}
// 定義一個變量存儲讀取的内容
b := make([]byte,1024)
// 讀取文件
for {
read, _ := file1.Read(b)
if read == 0 {
break
}
}
fmt.Printf("讀取内容: %s \n",b)
// 關閉文件
_ = file1.Close()
}
// 輸出: 讀取内容: Hello Word! 您好,世界!
寫入文件步驟: 打開文件(OpenFile) 、寫入文件(Write)、關閉文件(Close)
package main
import (
"fmt"
"os"
)
func main(){
fileName := "./public/hello.txt"
// 讀寫|創建|追加的模式 模式打開文件
file1, err := os.OpenFile(fileName,os.O_RDWR | os.O_CREATE | os.O_APPEND ,os.ModePerm )
if err != nil {
fmt.Printf("os.OpenFile 打開文件失敗,err:%s \n" , err.Error())
return
}
// 寫入文件
write, err := file1.Write([]byte("Go! Go! Let's Go!! 漢字 \n"))
if err != nil {
fmt.Printf("寫入失敗: %s \n",err.Error())
}
fmt.Printf("寫入字節數: %d \n",write)
// 關閉文件
_ = file1.Close()
}
Go語言提供了io.copy()方法,用來複制文件。
package main
import (
"fmt"
"io"
"os"
)
func main(){
// 把fileA文件複制給fileB
fileA := "./public/hello.txt"
fileB := "./public/new.txt"
// 打開源文件
sourceA, err := os.Open(fileA)
if err != nil {
fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error())
return
}
// 關閉文件A
defer sourceA.Close()
// 打開新文件
targetB, err := os.Create(fileB)
if err != nil {
fmt.Printf("os.Create 創建新文件失敗,err:%s \n" , err.Error())
return
}
// 關閉文件B
defer targetB.Close()
// 把fileA文件複制給fileB
written, err := io.Copy(targetB, sourceA)
if err != nil {
fmt.Printf("文件複制失敗,err:%s \n" , err.Error())
return
}
fmt.Printf("文件複制成功: %d \n" ,written)
}
同 3.3 删除目錄
微信搜索【猿碼記】獲取最新文章信息。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!