Gin Web Framework part 7

Gin Web Framework part 7درود دوستان امروز میخوام در مورد بخش هقتم از سری مقالات فرم ورک Gin صحبت کنیمفهرست بخش هقتم از این مقالهServing static filesServing static filesServing data from fileServing data from readerHTML renderingCustom Template rendererCustom Template Funcsمیریم واسه توضیح هر بخشقسمت اول Serving static filesبه کد های زیر دقت کنیدr.Static(&quot/assets&quot, &quot./assets&quot) r.StaricFS(&quot/more_static&quot, http.Dir(&quotmy_file_system&quot)) r.StaticFile(&quot/favicon.ico&quot, &quot./resources/favicon.ico&quot)خط اول تابع static مسیر یا روت اصلی رو برامون براگذاری میکنه به قول معروف فایل رو از ریشه برامون بارگذاری می کندخط دوم تابع staticfs مسیر های دیگه ای که اگه نیاز داریم رو برامون بارگذاری می کنهخط سوم تابع staticfile برای بارگذاری فایل خاصی از مسیر خاصی می باشد.قسمت دوم Serving data from filefunc main() { router := gin.Default() router.GET(&quot/local/file&quot, func(c *gin.Context) { c.File(&quotlocal/file.go&quot) }) var fs http.FileSystem = // ... router.GET(&quot/fs/file&quot, func(c *gin.Context) { c.FileFromFS(&quotfs/file.go&quot, fs) }) }توی خط چهارم اگر به فایلی که توی ریشه هست رو بخواهیم بفرستم باید از تابع c.file استفاده کنیمتوی خط هشت اگر ما بخوایم یه فایلی رو از یه آدرس مشخص که توی خط شیش ذکر کردیم بفرستم به روتی که توی خط هفت تعریف کردیم از این تابع filefromfs استفاده می کنیمقسمت سوم Serving data from readerfunc main() { router := gin.Default() router.GET(&quot/someDataFromReader&quot, func(c *gin.Context) { response, err := http.Get(&quothttps://raw.githubusercontent.com/gin-gonic/logo/master/color.png&quot) if err != nil || response.StatusCode != http.StatusOK { c.Status(http.StatusServiceUnavailable) return } reader := response.Body defer reader.Close() contentLength := response.ContentLength contentType := response.Header.Get(&quotContent-Type&quot) extraHeaders := map[string]string{ &quotContent-Disposition&quot: `attachment; filename=&quotgopher.png&quot`, } c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) }) router.Run(&quot:8080&quot) }اگر بخوایم یه سری اطلاعات رو توی هدر بنویسیم از متدی که در خط ۱۷ هست رو تعریف می کنیم شمای این متد به صورت زیر هستfunc (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { c.Render(code, render.Reader{ Headers: extraHeaders, ContentType: contentType, ContentLength: contentLength, Reader: reader, }) }قسمت چهارم HTML renderingبه کدهای زیر توجه کنید در ادامه توضیح خواهم دادfunc main() { router := gin.Default() router.LoadHTMLGlob(&quottemplates/**/*&quot) router.GET(&quot/posts/index&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotposts/index.tmpl&quot, gin.H{ &quottitle&quot: &quotPosts&quot, }) }) router.GET(&quot/users/index&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotusers/index.tmpl&quot, gin.H{ &quottitle&quot: &quotUsers&quot, }) }) router.Run(&quot:8080&quot) }خط سوم تابع loadhtmlglob مسیر فایل های tmpl و نشون میدهtemplates/posts/index.tmpl{{ define &quotposts/index.tmpl&quot }} <html><h1> {{ .title }} </h1> <p>Using posts/index.tmpl</p> </html> {{ end }}templates/users/index.tmpl{{ define &quotusers/index.tmpl&quot }} <html><h1> {{ .title }} </h1> <p>Using users/index.tmpl</p> </html> {{ end }}خط ۵ و ۱۰ فایل مدنظر ما رو نمایش میده با استفاده از متد c.html و ۶ و ۱۱ ما یه رشته رو داریم میفرستیم داخل اون tmpl های خودمون و برای نمایش اون مقدار داخل فایل tmpl باید از {{.namefiled}} استفاده کنیمقسمت پنجم Custom Template rendererهمچنین می توانید از کتابخانه "html/template" به صورت زیر استفاده کنیدimport &quothtml/template&quot func main() { router := gin.Default() html := template.Must(template.ParseFiles(&quotfile1&quot, &quotfile2&quot)) router.SetHTMLTemplate(html) router.Run(&quot:8080&quot) }قسمت شیشم Custom Template Funcsاگر بخوایم نوع فرمت نمایش توی خروجی رو سفارشی کنیم به صورت زیر یعنی فرض کنید که یه تاریخ زمانی دارید ولی فقط میخواید تاریخ رو نشون بدیدmain.goimport ( &quotfmt&quot &quothtml/template&quot &quotnet/http&quot &quottime&quot &quotgithub.com/gin-gonic/gin&quot ) func formatAsDate(t time.Time) string { year, month, day := t.Date() return fmt.Sprintf(&quot%d d/ d&quot, year, month, day) } func main() { router := gin.Default() router.Delims(&quot{[{&quot, &quot}]}&quot) router.SetFuncMap(template.FuncMap{ &quotformatAsDate&quot: formatAsDate, }) router.LoadHTMLFiles(&quot./testdata/template/raw.tmpl&quot) router.GET(&quot/raw&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotraw.tmpl&quot, gin.H{ &quotnow&quot: time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), }) }) router.Run(&quot:8080&quot) }raw.tmplDate: {[{.now | formatAsDate}]}Result:Date: 2017/07/01