要判斷數(shù)據(jù)類型,可以用Go的空接口:
10年積累的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有裕安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
建一個(gè)函數(shù)t 設(shè)置參數(shù)i 的類型為空接口,空接口可以接受任何數(shù)據(jù)類型
func t(i interface{}) {
//函數(shù)t
有一個(gè)參數(shù)i
switch i.(type) {
//多選語句switch
case string:
//是字符時(shí)做的事情
case int:
//是整數(shù)時(shí)做的事情
}
return
}
i.(type)
只能在switch中使用
這函數(shù)沒有返回值,你可以自己加入
還可以用反射:
package main
import (
"fmt"
"reflect"
)
func main() {
var x float64 = 3.4
fmt.Println("type:", reflect.TypeOf(x))
}
這樣就可以得出變量x的類型信息,與上面不同的是:上面的方法要先知到它是幾個(gè)類型中的一個(gè),而這個(gè)方法可以對任意對象使用
源碼碼地址---------
github:
碼云:
生成示例---------
參數(shù)配置--------conf.go
生成model--------
model文件能刪。最好不要?jiǎng)h除 ,那是電腦硬件驅(qū)動(dòng)比如聲卡和顯卡等等的。當(dāng)然,如果你感覺磁盤空間確實(shí)不夠,就部分刪除。刪除方法是右鍵model 選中model setting,點(diǎn)擊上方的減號,做第一步刪除,再次右鍵,會(huì)出現(xiàn)delete 這個(gè)時(shí)候就可以刪除了。
model的介紹
model是V4的版本文件保存格式,可以作為v4和v5文件格式轉(zhuǎn)換的中間格式。同時(shí),可以是catia v5高版本(比如r16)向低版本(比如r7)轉(zhuǎn)換的媒介。model在V5中只能瀏覽不能編輯,需要使用復(fù)制和粘貼的方式轉(zhuǎn)換為v5的part文件,才可以編輯了。當(dāng)然,如果你使用的是正版的catia,你可以使用tools下的utility內(nèi)的功能批量轉(zhuǎn)換為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)"` // 設(shè)置反向關(guān)系(可選)
}
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,如果表存在則會(huì)給出提示,如果改成false則不會(huì)提示 , 這句話沒有會(huì)報(bào)主鍵不存在的錯(cuò)誤
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默認(rèn)使用 default,你可以指定為其他數(shù)據(jù)庫
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)
}
}
執(zhí)行結(jié)果:
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;
查詢不到
第二次再執(zhí)行:
table `user` already exists, skip
table `profile` already exists, skip
查詢不到
如果 orm.RunSyncdb("default", false, true)改成 orm.RunSyncdb("default", false, false)
則執(zhí)行結(jié)果不會(huì)提示。
model層不允許使用 json, dto層又重復(fù)造輪子,一個(gè)表的字段可能20個(gè)左右,那么賦值語句難受死了。
其次就是json直接解析,model層的time.Time,完蛋格式不對,返回的數(shù)據(jù)不對。
比如
這種情況,無法解決,就需要必須重寫一個(gè)dto。
那么如何解決這個(gè)問題呢,本人思考了一段時(shí)間,最終使用Map來解決。
那么反射會(huì)遇到,各種奇葩的書寫方式,有些人什么都出傳入指針,有些人各種interface{} 隱藏轉(zhuǎn)換,反正就是太過于差異化。
所以就是需要解決,如何準(zhǔn)確的拿到Value對象,下面是我寫的一個(gè)工具類
解決這個(gè)問題,開干
下劃線如何解決,結(jié)構(gòu)體的字段屬于駝峰命名法,怎么解決呢?
寫了一個(gè)簡單的工具類
問題:1、如果是 ID ,連續(xù)大寫,輸出 i_d
2、因?yàn)閿?shù)組到切片需要拷貝一次,所以可以利用unsafe解決,因?yàn)樽址讓泳褪乔衅遣话踩?/p>
1、解決time的問題
2、反射、下劃線命名法
輸出結(jié)果:
完美,美中不足是需要使用likedMap,由于Golang源碼包沒有,所以,注定亂序
model是V4的版本文件保存格式,可以作為v4和v5文件格式轉(zhuǎn)換的中間格式。
同時(shí),可以是catia v5高版本(比如r16)向低版本(比如r7)轉(zhuǎn)換的媒介。
model在V5中只能瀏覽不能編輯,需要使用復(fù)制和粘貼的方式轉(zhuǎn)換為v5的part文件,才可以編輯了。
當(dāng)然,如果你使用的是正版的catia,你可以使用tools下的utility內(nèi)的功能批量轉(zhuǎn)換為part文件
不過,不管使用上面兩種方法中的哪一種,得到的均是無參數(shù),無關(guān)聯(lián)的特征