read方法
package main
import (
"fmt"
"io"
"os"
)
func main() {
//打开对应目录形成file结构体
file, err := os.Open("")
if err == nil {
sum := 0
buf := make([] byte, 2010)
for {
//返回读取的长度
n, err := file.Read(buf)
sum += n
if err == io.EOF {
break
}
}
fmt.Println("the size of file is ", sum)
}
}
代码量太大,对于文件内容比较多也不合适
ioutil
使用ioutil包的ReadFile来代替,直接获得文件的内容,进而计算出文件的大小。
import (
"fmt"
"io/ioutil"
)
func main() {
//返回的是byte数组
cntent, err := ioutil.ReadFile("...")
if err == nil {
fmt.Println("file size is ", len(cntent))
}
}
// ReadFile reads the file named by filename and returns the contents.
// A successful call returns err == nil, not err == EOF. Because ReadFile
// reads the whole file, it does not treat an EOF from Read as an error
// to be reported.
//
// As of Go 1.16, this function simply calls os.ReadFile.
func ReadFile(filename string) ([]byte, error) {
return os.ReadFile(filename)
}
终极方案
不再读取文件的内容
func main() {
file, err := os.Open("")
if err == nil {
fi, _ := file.Stat()
fmt.Println("file size is ", fi.Size())
}
}
终极方案使用,使用os.Stat方法
fi, err := os.Stat("water")
isExist := os.IsNotExist()//可以判断是否存在
if err == nil {
fmt.Println(fi.Size(), err)
HTML模板
test.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Go Web</title>
</head>
<body>//关键就是这里
{{ . }}
</body>
</html>
前面的html文件中使用了一个template的语法{{.}},这部分是需要通过go的template引擎进行解析,然后替换成对应的内容。
对应的go函数为
package main
import (
"html/template"
"net/http"
)
func tmpl(w http.ResponseWriter, r *http.Request) {
//这里会进行解析
t1, err := template.ParseFiles("test.html")
if err != nil {
panic(err)
}
t1.Execute(w, "hello world")
}
func main() {
server := http.Server{
Addr: "127.0.0.1:8080",
}
http.HandleFunc("/tmpl", tmpl)
server.ListenAndServe()
}
handler函数中使用template.ParseFiles(“test.html”),它会自动创建一个模板(关联到变量t1上),并解析一个或多个文本文件(不仅仅是html文件),解析之后就可以使用Execute(w,“hello world”)去执行解析后的模板对象,执行过程是合并、替换的过程。例如上面的{{.}}中的.会替换成当前对象"hello world",并和其它纯字符串内容进行合并,最后写入w中,也就是发送到浏览器"hello world"。
也就是最后浏览器会输出
在写template的时候,会经常用到"."。比如{{.}}、{{len .}}、{{.Name}}、{{$x.Name}}等等。
在template中,点"."代表当前作用域的当前对象。它类似于java/c++的this关键字
type Person struct {
Name string
Age int
}
func main(){
p := Person{"longshuai",23}
tmpl, _ := template.New("test").Parse("Name: {{.Name}}, Age: {{.Age}}")
_ = tmpl.Execute(os.Stdout, p)
}
这里{{.Name}}和{{.Age}}中的点"."代表的是顶级作用域的对象p,所以Execute()方法执行的时候,会将{{.Name}}替换成p.Name,同理{{.Age}}替换成{{p.Age}}。