运用go语言的模板(template)写的第一个程序示例

一、模板(template)与渲染

  • 模板其实就相当于一个简历模板,上面的格式都是已经确定了的
  • 渲染就是往对应的地方填写相应的数据

二、模板

  1. 模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。
  2. 模板文件中使用{{.}}包裹和标识需要传入的数据,用点号(.)来替换传入的数据,如果数据是复杂类型的数据,可以通过{ { .FieldName }}来访问它的字段。但是输出的结果中,不会显示{{.}},只会显示传入的数据。

三、模板的使用

Go语言模板引擎的使用可以分为三部分:定义模板文件、解析模板文件和模板渲染.

1. 定义模板文件

其中,定义模板文件时需要我们按照相关语法规则去编写。

2. 解析模板文件

上面定义好了模板文件之后,可以使用下面的常用方法去解析模板文件,得到模板对象:

func (t *Template) Parse(src string) (*Template, error)
func ParseFiles(filenames ...string) (*Template, error)
func ParseGlob(pattern string) (*Template, error)

当然,你也可以使用func New(name string) *Template函数创建一个名为name的模板,然后对其调用上面的方法去解析模板字符串或模板文件。

3. 模板渲染

渲染模板简单来说就是使用数据去填充模板,当然实际上可能会复杂很多。

func (t *Template) Execute(wr io.Writer, data interface{}) error
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error

四、代码示例

1. 定义模板文件

<!DOCTYPE html>

<head>
    <title>Hello</title>
</head>
<body>
    <p>Hello, {{.}}</p>
</body>
</html>

2. 解析和渲染模板文件

以下代码会启动一个HTTP服务器,监听本地的8080端口,并使用helloHandler函数处理所有的HTTP请求,当浏览器访问8080端口时,服务器会对这些HTTP请求使用helloHandler函数做相应的处理,最后通过响应体返回给浏览器。

package main

import (
	"fmt"
	"html/template"
	"net/http"
)

func hellohandler(w http.ResponseWriter, r *http.Request) {
	// 解析模板
	t, err := template.ParseFiles("./hello.tmpl")			// ./表示当前目录下,是相对路径的一种表示方法
	if err != nil {
		fmt.Println("Parse template failed, err:%v", err)
	}
	// 渲染模板
	name := "小王子"
	err = t.Execute(w, name)
	if err != nil {
		fmt.Println("render template failed,err:%v", err)
		return
	}
}

func main() {
	http.HandleFunc("/", hellohandler)		// 不会开启一个HTTP服务器,而是当输入/时,会触发helloHandler函数来处理所有的HTTP请求

	err := http.ListenAndServe(":9000", nil)				// 会开启一个HTTP服务器,去监听9000端口,当浏览器中输入127.0.0.1:9000/ 的时候,服务器就会返回hellohandler中处理的结果

	if err != nil {
		fmt.Println("HTTP server start failed, err:%v", err)
		return
	}
}

请添加图片描述

通过go build将其解析成二进制文件,然后./gin_lesson运行一下。

3. 查看结果

请添加图片描述

五、参考文章

https://www.liwenzhou.com/posts/Go/template/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多目标多角度模板匹配是一种较为复杂的计算机视觉算法,需要大量的图像处理和计算。下面是一个简单的示例程序,它可以实现多目标多角度模板匹配的功能,并且不依赖于第三方库。 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.1415926 // 定义图像大小 #define IMAGE_WIDTH 640 #define IMAGE_HEIGHT 480 // 定义模板大小 #define TEMPLATE_WIDTH 40 #define TEMPLATE_HEIGHT 40 // 定义模板数和角度数 #define TEMPLATE_NUM 3 #define ANGLE_NUM 4 // 声明函数 void readImage(unsigned char *image, const char *fileName); void writeImage(unsigned char *image, const char *fileName); void drawRectangle(unsigned char *image, int x, int y, int w, int h, int color); void drawCross(unsigned char *image, int x, int y, int size, int color); void createTemplate(unsigned char *image, int num, int angle); void matchTemplate(unsigned char *image, unsigned char *templateImage, int *x, int *y, double *score); int main(int argc, char **argv) { unsigned char *image = (unsigned char *)malloc(IMAGE_WIDTH * IMAGE_HEIGHT * sizeof(unsigned char)); unsigned char *templateImage = (unsigned char *)malloc(TEMPLATE_WIDTH * TEMPLATE_HEIGHT * sizeof(unsigned char)); // 读取图像 readImage(image, "input.bmp"); // 循环创建模板 for (int i = 0; i < TEMPLATE_NUM; i++) { for (int j = 0; j < ANGLE_NUM; j++) { // 创建模板 createTemplate(templateImage, i, j); // 匹配模板 int x, y; double score; matchTemplate(image, templateImage, &x, &y, &score); // 绘制匹配结果 drawRectangle(image, x, y, TEMPLATE_WIDTH, TEMPLATE_HEIGHT, 255); drawCross(image, x + TEMPLATE_WIDTH / 2, y + TEMPLATE_HEIGHT / 2, 10, 255); printf("Template %d, Angle %d, Position (%d, %d), Score %f\n", i, j, x, y, score); } } // 保存结果 writeImage(image, "output.bmp"); free(image); free(templateImage); return 0; } // 读取图像 void readImage(unsigned char *image, const char *fileName) { FILE *fp = fopen(fileName, "rb"); fread(image, IMAGE_WIDTH * IMAGE_HEIGHT, 1, fp); fclose(fp); } // 保存图像 void writeImage(unsigned char *image, const char *fileName) { FILE *fp = fopen(fileName, "wb"); fwrite(image, IMAGE_WIDTH * IMAGE_HEIGHT, 1, fp); fclose(fp); } // 绘制矩形 void drawRectangle(unsigned char *image, int x, int y, int w, int h, int color) { for (int i = y; i < y + h; i++) { for (int j = x; j < x + w; j++) { image[i * IMAGE_WIDTH + j] = color; } } } // 绘制十字 void drawCross(unsigned char *image, int x, int y, int size, int color) { for (int i = y - size / 2; i < y + size / 2; i++) { image[i * IMAGE_WIDTH + x] = color; } for (int i = x - size / 2; i < x + size / 2; i++) { image[y * IMAGE_WIDTH + i] = color; } } // 创建模板 void createTemplate(unsigned char *image, int num, int angle) { // 初始化模板 for (int i = 0; i < TEMPLATE_WIDTH * TEMPLATE_HEIGHT; i++) { image[i] = 0; } // 绘制模板 int cx = TEMPLATE_WIDTH / 2; int cy = TEMPLATE_HEIGHT / 2; int r = TEMPLATE_WIDTH / 4; for (int i = 0; i < 4; i++) { double theta = (double)i * PI / 2.0 + (double)angle * PI / 4.0; int x = cx + r * cos(theta); int y = cy + r * sin(theta); drawRectangle(image, x - r / 2, y - r / 2, r, r, 255); } } // 匹配模板 void matchTemplate(unsigned char *image, unsigned char *templateImage, int *x, int *y, double *score) { // 初始化匹配结果 *x = 0; *y = 0; *score = -1.0; // 循环匹配 for (int i = 0; i < IMAGE_HEIGHT - TEMPLATE_HEIGHT; i++) { for (int j = 0; j < IMAGE_WIDTH - TEMPLATE_WIDTH; j++) { double sum = 0.0; double sum2 = 0.0; for (int k = 0; k < TEMPLATE_HEIGHT; k++) { for (int l = 0; l < TEMPLATE_WIDTH; l++) { int index1 = (i + k) * IMAGE_WIDTH + j + l; int index2 = k * TEMPLATE_WIDTH + l; sum += (double)image[index1] * (double)templateImage[index2]; sum2 += (double)image[index1] * (double)image[index1]; } } double tempScore = sum / sqrt(sum2); if (tempScore > *score) { *x = j; *y = i; *score = tempScore; } } } } ``` 这个程序实现了一个简单的多目标多角度模板匹配算法,其中主要函数包括: - `readImage`:读取图像文件; - `writeImage`:保存图像文件; - `drawRectangle`:绘制矩形框; - `drawCross`:绘制十字线; - `createTemplate`:创建模板; - `matchTemplate`:匹配模板。 在程序中,我们首先读取输入图像,然后循环创建模板,并进行模板匹配。对于每个匹配结果,我们绘制矩形框和十字线,并输出匹配结果的位置和得分。最后,我们保存匹配结果图像。需要注意的是,这个程序仅仅是一个示例,实际应用中可能需要根据具体需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值