より具体的な回答例を示しておきます。
https://play.golang.org/p/zY1YPo4CddV
go
1package main
2
3import (
4 "bytes"
5 "html/template"
6 "io"
7 "os"
8
9 "golang.org/x/net/html"
10)
11
12const DefaultOGImageURL = "/assets/default.jpg"
13const layout = `<html>
14<head>
15 <meta charset="UTF-8">
16
17 <!--OGP設定-->
18 <meta property="og:image" content="{{.OGImageURL}}" />
19
20 <title>hoge</title>
21</head>
22
23<body>
24 <!-- この部分に動的に生成されたHTMLが挿入される -->
25 <!-- 最初に現れる画像を上部のmetaタグ内に入れたい -->
26 {{.Contents}}
27</body>
28</html>
29`
30
31var layoutTemplate = template.Must(template.New("").Parse(layout))
32
33func getFirstImageURL(contents string) string {
34 // ここでcontentsから最初の画像リンクを取得して見つかったらそれを返す
35 tokenizer := html.NewTokenizer(bytes.NewBufferString(contents))
36 for {
37 t := tokenizer.Next()
38 if t == html.ErrorToken {
39 break
40 }
41 switch t {
42 case html.SelfClosingTagToken:
43 b, hasAttr := tokenizer.TagName()
44 if string(b) == "img" && hasAttr {
45 for {
46 key, value, more := tokenizer.TagAttr()
47 if string(key) == "src" {
48 return string(value)
49 }
50 if !more {
51 break
52 }
53 }
54 }
55 }
56 }
57 return DefaultOGImageURL
58}
59
60func renderHTML(w io.Writer, contents string) {
61 layoutTemplate.Execute(w, map[string]interface{}{
62 "OGImageURL": getFirstImageURL(contents),
63 "Contents": template.HTML(contents),
64 })
65}
66
67func main() {
68 renderHTML(os.Stdout, `<img src="/screenshot.jpg"/>`)
69}