要判断数据类型,可以用Go的空接口:
10年积累的成都网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先建设网站后付款的网站建设流程,更有裕安免费网站建设让你可以放心的选择与我们合作。
建一个函数t 设置参数i 的类型为空接口,空接口可以接受任何数据类型
func t(i interface{}) {
//函数t
有一个参数i
switch i.(type) {
//多选语句switch
case string:
//是字符时做的事情
case int:
//是整数时做的事情
}
return
}
i.(type)
只能在switch中使用
这函数没有返回值,你可以自己加入
还可以用反射:
package main
import (
"fmt"
"reflect"
)
func main() {
var x float64 = 3.4
fmt.Println("type:", reflect.TypeOf(x))
}
这样就可以得出变量x的类型信息,与上面不同的是:上面的方法要先知到它是几个类型中的一个,而这个方法可以对任意对象使用
源码码地址---------
github:
码云:
生成示例---------
参数配置--------conf.go
生成model--------
model文件能删。最好不要删除 ,那是电脑硬件驱动比如声卡和显卡等等的。当然,如果你感觉磁盘空间确实不够,就部分删除。删除方法是右键model 选中model setting,点击上方的减号,做第一步删除,再次右键,会出现delete 这个时候就可以删除了。
model的介绍
model是V4的版本文件保存格式,可以作为v4和v5文件格式转换的中间格式。同时,可以是catia v5高版本(比如r16)向低版本(比如r7)转换的媒介。model在V5中只能浏览不能编辑,需要使用复制和粘贴的方式转换为v5的part文件,才可以编辑了。当然,如果你使用的是正版的catia,你可以使用tools下的utility内的功能批量转换为part文件。
models.go
============================
package main
import (
"github.com/astaxie/beego/orm"
)
type User struct {
Id int
Name string
Profile *Profile `orm:"rel(one)"` // OneToOne relation
}
type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // 设置反向关系(可选)
}
func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(User), new(Profile))
}
main.go
==============
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
//orm.RegisterModel(new(User))
orm.RegisterDataBase("default", "mysql", "ta3:ta3@/ta3?charset=utf8")
orm.RunSyncdb("default", false, true) // true 改成false,如果表存在则会给出提示,如果改成false则不会提示 , 这句话没有会报主键不存在的错误
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,你可以指定为其他数据库
user := User{Id: 1}
err := o.Read(user)
if err == orm.ErrNoRows {
fmt.Println("查询不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主键")
} else {
fmt.Println(user.Id, user.Name)
}
}
执行结果:
create table `user`
-- --------------------------------------------------
-- Table Structure for `main.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(255) NOT NULL,
`profile_id` integer NOT NULL UNIQUE
) ENGINE=InnoDB;
create table `profile`
-- --------------------------------------------------
-- Table Structure for `main.Profile`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `profile` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`age` smallint NOT NULL
) ENGINE=InnoDB;
查询不到
第二次再执行:
table `user` already exists, skip
table `profile` already exists, skip
查询不到
如果 orm.RunSyncdb("default", false, true)改成 orm.RunSyncdb("default", false, false)
则执行结果不会提示。
model层不允许使用 json, dto层又重复造轮子,一个表的字段可能20个左右,那么赋值语句难受死了。
其次就是json直接解析,model层的time.Time,完蛋格式不对,返回的数据不对。
比如
这种情况,无法解决,就需要必须重写一个dto。
那么如何解决这个问题呢,本人思考了一段时间,最终使用Map来解决。
那么反射会遇到,各种奇葩的书写方式,有些人什么都出传入指针,有些人各种interface{} 隐藏转换,反正就是太过于差异化。
所以就是需要解决,如何准确的拿到Value对象,下面是我写的一个工具类
解决这个问题,开干
下划线如何解决,结构体的字段属于驼峰命名法,怎么解决呢?
写了一个简单的工具类
问题:1、如果是 ID ,连续大写,输出 i_d
2、因为数组到切片需要拷贝一次,所以可以利用unsafe解决,因为字符串底层就是切片,但是不安全
1、解决time的问题
2、反射、下划线命名法
输出结果:
完美,美中不足是需要使用likedMap,由于Golang源码包没有,所以,注定乱序
model是V4的版本文件保存格式,可以作为v4和v5文件格式转换的中间格式。
同时,可以是catia v5高版本(比如r16)向低版本(比如r7)转换的媒介。
model在V5中只能浏览不能编辑,需要使用复制和粘贴的方式转换为v5的part文件,才可以编辑了。
当然,如果你使用的是正版的catia,你可以使用tools下的utility内的功能批量转换为part文件
不过,不管使用上面两种方法中的哪一种,得到的均是无参数,无关联的特征