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

包管理的火热程度居然没有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. VUE 意淫笔记

    caihg Vue.js 递归组件实现树形菜单 最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: 1 2 3 4 5 6 7 8 9 i ...

  2. P,NP,NP_hard,NP_complete问题定义

    背景:在看李航的<统计学习方法时>提到了NP完全问题,于是摆之. 问题解答:以下是让我豁然开朗的解答的摘抄: 最简单的解释:P:算起来很快的问题NP:算起来不一定快,但对于任何答案我们都可 ...

  3. Elasticsearch推荐插件篇(head,sense,marvel)

    安装head head插件可以用来快速查看elasticsearch中的数据概况以及非全量的数据,也支持控件化查询和rest请求,但是体验都不是很好. 一般就用它来看各个索引的数据量以及分片的状态. ...

  4. Fiddler实战深入研究(二)

    Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...

  5. 关于 fir.im 你可能不知道的实用小工具

    大家可能都知道 fir.im 是做测试发包的,上传你的 IPA/APK, 测试用户可以通过一个短链接和二维码就可快速安装测试. 除了基本的发包功能即应用上传下载外,fir.im 还为提高发包体验提供了 ...

  6. 好友录v1.2.7_Build(7790)

    <好友录>是使用.net Framework4.0+sqlite开发的,属于WingKu(谷毅科技)系列软件之一.它是一款外观时尚.美观,操作简单.易用,功能强大的个人通讯信息管理软件.它 ...

  7. hadoop安装遇到的各种异常及解决办法

    hadoop安装遇到的各种异常及解决办法 异常一: 2014-03-13 11:10:23,665 INFO org.apache.hadoop.ipc.Client: Retrying connec ...

  8. TTAS Lock C++11 实现

    template<class Lock> class Lock_guard{ private: Lock lock; public: explicit Lock_guard(Lock&am ...

  9. 选择排序java代码

    /** * 选择排序 * * 原理:将最小值与数组第1个即array[0]交换,第二次则忽略array[0],直接从array[1]至array[array.length-1]中 * 选择出最小值与a ...

  10. c#连接mysql环境配置

    写.net的时候一直用的都是sql sever,mysql小 有命令行方便就想试了一下,网上搜很久,下载很多配置文件都不成功.昨晚上搞到两点多,冒着生命危险. 后来终于在一个网站上找到这个 MySQL ...