go_读文件,html模板

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}}。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值