十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.用{{}}包围的是变量,如 {{testName}} ,这表示把给定变量的值插入, {%%}这是块元素 在faygo里叫tag,常见的有 for , if 等
十年的东宁网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整东宁建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“东宁网站设计”,“东宁网站推广”以来,每个客户项目都认真落实执行。
2.如何在模板中定义变量, 平常我们在使用的模板的时候的常会有这样的需要,在模板中要定义一个变量以方便前端逻辑的实现,在faygo模板中定义变量需要用到标签{%set%}
使用方法
{#定义变量 newName #}
{% set newName = "hello faygo" %}
{#获取变量newName的值#}
{{newName}}
定义用 tag set 取值就是上文所提到的{{}}取值
3.在模板中调用方法
这也是一个非常常见和有用的方法,在faygo中调用方法有两种方式 , 一是在渲染模板时在faygo.Map在加入你要调用的方法 , 二是注册一个全局的方法 (在faygo里叫filter过滤器),我们分别来看一下每个方法的实现
1) 在渲染模板时加入方法(render)
//在后端render时加入方法 testFunc
rErr := ctx.Render(200, switchDir+"index.html", faygo.Map{
"TITLE": title,
"testMap": map[string]string{"aaa": "111111"},
"testFunc": func(s string) string {
return s + " this is test func"
},
})
{#前端模板中调用#}
{{ testFunc("hello") }}
结果如下
hello this is test func
这种方法适合只用于此模板一个特殊方法 , 在其它功能中不通用 ,那么如果想定义一个方法全局都可以使用怎么办,这里就需要注册全局方法了(见下文)
2)注册全局方法(过滤器)
如果想定义一个方法全局都可以使用怎么办 ,这里就需要注册一个方法
// pongo2 注册一个全局过滤器,一般在程序启动时init中注册
//这里注册了一个名叫testFilter的过滤器,指向TestFilterFunc方法
pongo2.RegisterFilter("testFilter", TestFilterFunc)
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
a := in.String() + " this is global filter"
return pongo2.AsValue(a), nil
}
在这里我们看到TestFilterFunc方法里接收参数和返回参数的类型是pongo2.Value和pongo2.Error
在注册过滤器里方法的接收参数和返回参数是固定的这两个不能改变
官网的话:
All functions’ parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.
那么我们返回数据时怎么返回? 在上面例子在我们看到了 AsValue 这个方法可以将我们数据返回,我们可以返回struct,map,array,string 等
在前端调用
{{ "hello" | testFilter }}
结果:
hello this is global filter
返回结构体:
type LoginUserInfo struct {
Username string `json:"username"`
Telephone string `json:"telephone"`
Email string `json:"email"`
Level int `json:"level"`
}
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
userInfo := LoginUserInfo{
Username: "userA",
Telephone: "123456",
Email: "123456@test.com",
Level: 1,
}
return pongo2.AsValue(userInfo), nil
}
前端使用:
{#定义一个变量接收struct数据 #}
{% set uinfo = "" | testFilter %}
{#取用户名字#}
{{ uinfo.Username }}
注意,如是 uinfo 只是一个struct 不是struct数组([]uinfo)时 在模板中不能使用{% for %} 使用也不会得到任何数据
如果uinfo是struct数组 在模板中for循环时不要使用 key,val in uinfo
如果uinfo是struct数组 uinfo = []userInfo{}
{#错误示例#}
{% for key,val in uinfo %}
{{val.Username}}
{% endfor %}
struct数据不能使用key,否则循环会执行,但取不到任何数据
{# 正确示例 #}
{% for val in uinfo %}
{{val.Username}}
{% endfor %}
说一下返回map时 用for循环的情况,无论是否是map数组都可以用for key,val in uinfo 来遍历数据
4. 在模板中字符串的连接和宏标签的使用
在模板中有时我们会碰到这样的需要:在模板中有几个变量 ,我们想把这几个变量连接在一起赋值给另一个变量以做其它操作
例: 在模板中有三个变量 host是域名,route是路由地址,param是参数 ,要把这三个变量连接起来赋值给另一个新的变量做urlencode操作。这应该怎么办
因为在模板中使用 + 号连接变量时,程序会认为是数学运算,两个字符串的连接值为0, 如果用内置的filter: join来连接需要传入一个slice,但这三个只是字符串变量。
这个时候我们可能就要用到宏标签了% macro %% endmacro %.
思路是这样的,在宏标签中定义一个宏(可以理解为一个方法),这个宏接收三个参数(参数个数看需求而定),在宏内返回连接的字符串
代码:
{#定义三个变量#}
{% set host="" %}
{% set route="/aaa/bbb" %}
{% set param= "?id=123" %}
{#定义一个宏标签接收三个参数,并返回。注意在宏标签内如果换行,输出的结果中也会有换行,在urlencode的时候也会把换行符进行转义#}
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}
hr
{#定义一个新变量调用宏方法,并将三个参数传入#}
{% set newurl = joinUrl(host,route,param) %}
{#输出newurl的值#}
{{newurl}}br
{#输入出urlencode后的字符串#}
{{newurl|urlencode}}br
结果:
http%3A%2F%2F
在宏标签在也可加入自定义的一些字符串如在上面的宏标签返回结果中要加一个固定字符可以这样写:
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}
起码得掌握go基础语法和iris、gin还有beego这些常用的web框架,然后尝试去写一个web服务器或者一个后端api接口服务项目,就可以去找基础的go开发岗位了。慕课网有一门go开发工程师的体系课,如果吃透了这门课,对转型go开发非常有帮助。
Revel Web开源框架
个高效的Go语言Web开发框架, 其思路完全来自 Java 的 Play Framework。
特点
热编译,简单可选,同步(每个请求都创建自己的goroutine来处理。
Go语言Web框架:beego
一个用Go开发的应用框架,思路来自于tornado,路由设计来源于sinatra。
支持特性
MVC;
REST;
智能路由;
日志调试;
配置管理;
模板自动渲染;
layout设计;
中间件插入逻辑;
方便的JSON/XML服务;
最近在学习Go语言,利用之前的项目作为案例进行重构。项目背景:php提供TCP服务,硬件连接服务器需要处理信息,然后将处理的信息在发送客户端,客户端拿到信息展示给用户。第一种方案客户端对发送信息的接口进行轮询,检查硬件是否有信息返回,这样不好太浪费资源;第二种方案采用websocket将信息主动发送给客户端,客户端做后续的展示和处理工作;所以最终采用websocket。PHP实现websocket采用GatewayWorker,经过商业论证还是很稳定的。
在用Go语言重构项目的时候,需要用Go重新搭建Websocket,去网上查了一些资料,利用 gorilla/websocket 在嵌套web框架就可以实现websocket,目前采用Go语言的iris Web框架,接下来就说说我是怎么实现的。
这里有个评测:
最快的还是fasthttp,iris也是基于fasthttp的,不会比fasthttp快
golang学习比较简单,不过任何一门语言都不是孤立存在的,在这里简要说明一下golang开发的学习路线
1.golang基础,包括go语言安装,go语言语法,流程控制语句,函数,方法,面向对象概念,网络编程,并发编程等
2.golang开发框架,包括beego,gin,Iris,Echo等
3.微服务开发
4.深入的话还可以学习算法部分。如果要接触区块链相关技术的话,还需要学习区块链的加密算法等相关知识
5.如果要结合go实现应用的话,肯定离不开各种数据库,比如关系型数据库oracle、mysql,或者各类非关系型数据库等等
6.如果需要开发界面的话,还需要学习网页编程如html,javascript,vue,elementUI,bootstrap等网页开发技术和框架。
7.在以上学习的基础上还可以向架构方面深入学习。
链乔教育在线祝您学有所成。