由于比较古怪的语言特性,感觉代码的封装性是一种不同的思路。

包管理的火热程度居然没有nodejs高,这是为什么

package form

import (
"encoding/gob"
"reflect"
"regexp"
"time"
) type FormData struct {
Errors map[string]error `json:"-" xml:"-" form:"-"`
Warning map[string]string `json"-" xml:"-" form: "-"`
Checked bool `json"-" xml:"-" form: "-"`
} // Use that as an amonynous field for creating form.
type Form struct {
Data *FormData
} // Get Error
func (f *Form) Err(name string) error {
if f.Data == nil {
return nil
}
if f.Data.Errors == nil {
return nil
}
return f.Data.Errors[name]
} // Set Error
func (f *Form) SetErr(name string, err error) {
if f.Data == nil {
f.Data = &FormData{}
}
if f.Data.Errors == nil {
f.Data.Errors = map[string]error{}
}
f.Data.Errors[name] = err
} // Has at least one Error
func (f *Form) HasErr() bool {
if f.Data == nil {
return false
}
return f.Data.Errors != nil
} // Returns Error Format.
func (f *Form) ErrFormat() string {
return `<p>%v</p>`
} // Get Warning
func (f *Form) GetWarning(name string) string {
if f.Data == nil {
return ""
}
if f.Data.Warning == nil {
return ""
}
return f.Data.Warning[name]
} // Set Warning
func (f *Form) SetWarning(name, warning string) {
if f.Data == nil {
f.Data = &FormData{}
}
if f.Data.Warning == nil {
f.Data.Warning = map[string]string{}
}
f.Data.Warning[name] = warning
} // Returns Warning Format
func (f *Form) WarningFormat() string {
return `<p>%v</p>`
} // Return Group Format
func (f *Form) Group() string {
return `%v`
} // Return Group Format Success
func (f *Form) GroupSuccess() string {
return `%v`
} // Return Group Error Format
func (f *Form) GroupError() string {
return `%v`
} // Return Group Warning Format
func (f *Form) GroupWarning() string {
return `%v`
} // Wrap around Form Input
func (f *Form) Wrap() string {
return `%v`
} // Been Checked
func (f *Form) BeenChecked() bool {
if f.Data == nil {
return false
}
return f.Data.Checked
} // Mark as Checked
func (f *Form) Check() {
if f.Data == nil {
f.Data = &FormData{}
}
f.Data.Checked = true
} // Form Interface
type FormInterface interface {
Err(string) error
SetErr(string, error)
HasErr() bool
ErrFormat() string
GetWarning(string) string
SetWarning(string, string)
WarningFormat() string
Group() string
GroupSuccess() string
GroupError() string
GroupWarning() string
Wrap() string
BeenChecked() bool
Check()
} // A String that implement the error interface
type FormError string func (f FormError) Error() string {
return string(f)
} func init() {
gob.Register(&Form{})
gob.Register(FormError(""))
gob.Register(&FormData{})
} type form struct {
m reflect.Value
t reflect.Type
v reflect.Value
field reflect.StructField
value reflect.Value
name, preferedName, ftype string
} func (f form) get(suffix string) interface{} {
m := f.m.MethodByName(f.name + suffix)
if !m.IsValid() {
return nil
}
in := make([]reflect.Value, )
values := m.Call(in)
if len(values) == {
return nil
}
return values[].Interface()
} func (f form) getStr(suffix string) (string, bool) {
str, ok := f.get(suffix).(string)
return str, ok
} func (f form) getStrs(suffix string) ([]string, bool) {
strs, ok := f.get(suffix).([]string)
return strs, ok
} func (f form) getStrMap(suffix string) (map[string]string, bool) {
mstr, ok := f.get(suffix).(map[string]string)
return mstr, ok
} func (f form) getInt(suffix string) (int64, bool) {
num, ok := f.get(suffix).(int64)
return num, ok
} func (f form) getFloat(suffix string) (float64, bool) {
num, ok := f.get(suffix).(float64)
return num, ok
} func (f form) getBool(suffix string) (bool, bool) {
b, ok := f.get(suffix).(bool)
return b, ok
} func (f form) getRegExp(suffix string) (*regexp.Regexp, bool) {
re, ok := f.get(suffix).(*regexp.Regexp)
return re, ok
} func (f form) getTime(suffix string) (time.Time, bool) {
_time, ok := f.get(suffix).(time.Time)
return _time, ok
}
 

Go语言的编程范式的更多相关文章

  1. 云风:我所偏爱的C语言面向对象编程范式

    面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI 框架,又比如 3d 渲染引擎中的场景管 ...

  2. Linux Kernel C语言编程范式

    介绍 不同的编程语言具有不同的抽象原语(如下),有的原语抽象层次低,有的原语抽象层次高.其中函数式.DSL是这几年十分热门的编程语言概念. 过程式抽象原语:变量 对象式抽象原语:对象 函数式抽象原语: ...

  3. 【编程范式】C语言1

    最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * ...

  4. ReactiveX编程范式

    ReactiveX http://reactivex.io/ An API for asynchronous programmingwith observable streams The Observ ...

  5. 编程范式感想(一)——在C中进行对模板功能的实现

    最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下C还有汇编,熟悉下计算机的内存机制什么的. 大家都知道关于模板或者说范式的问题,基本在很多高级语言上都有实 ...

  6. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?

    2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...

  7. 冒号课堂 编程范式与OOP思想

    上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...

  8. Python3学习之路~6.1 编程范式:面向过程 VS 面向对象

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...

  9. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

随机推荐

  1. 使用JSSDK集成微信分享遇到的一些坑

    h5项目中需要集成微信分享,以实现自定义标题.描述.图片等功能.结果遇到了很多坑. 准备工作 务必详细阅读微信JS-SDK说明文档 需要后端支持 强烈建议下载使用微信web开发者工具 按文档配置好公众 ...

  2. JS中的宽高(基础知识很重要)

    IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度document.docu ...

  3. [Java面试十二]数据库概念相关

    1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的SQL语句,它的优点有:     允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次.     允许更快执 ...

  4. ASP.NET MVC 拦截器IResultFilter

    在ASP.NET MVC中,有一个Result拦截器,实现ResultFilter需要继承一个类(System.Web.Mvc.FilterAttribute)和实现一个类(System.Web.Mv ...

  5. 每天一个linux命令(31): /etc/group文件详解

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...

  6. 解决TryUpdateModel对象为空的问题

    MVC中的TryUpdateModel确实给开发带来不少便利,但是如果绑定在View上的文本控件没有填写值的时候,再执行TryUpdateModel对应的实体属性就会为空. 如果数据库中对应的字段不允 ...

  7. RESTORE DATABASE的standby选项

    RESTORE DATABASE [db1] FROM DISK = N'E:\Backup\db2.bak' , MOVE N'db1_Data' TO N'D:\Data\db2.MDF', MO ...

  8. 仿SGI STL的traits技法

    首先是iterator traits,这个是用来萃取迭代器的特性的 #ifndef _STL_ITERATOR_H_ #define _STL_ITERATOR_H_ #include <cst ...

  9. Parametric Curves and Surfaces

    Parametric Curves and Surfaces eryar@163.com Abstract. This paper is concerned with parametric curve ...

  10. 邻接表无向图(三)之 Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http:/ ...