# tdengine-mapper-go > Golang 的 struct 与 TDengine 表进行映射 ### struct 标签 ``` db : 表的列名, 值为 "" 或 "-" 表示忽略 taos : taos的标签,目前只有 [tag], 表示当前是 超级表的 TAG 字段 ``` ### struct 接口 ```go type SuperTableNamer interface { SuperTableName() string // 获取超级表的表名 可选 } type TableNamer interface { TableName() string // 当前表的表名 } ``` `TableNamer` 是必须要实现的接口 `SuperTableName` 是可选实现的,如果没有 实现,就会当普通表进行处理 ### 批量插入 -- 示例 ```go type User struct { Name string `db:"name" taos:"tag"` Age int `db:"age"` } func (u *User) TableName() string { return "user_" + u.Name } func (u *User) SuperTableName() string { return "super_user" } func TestSimpleInsert(t *testing.T) { tdMapper := NewMapper() data := []any{ &User{Name: "张三", Age: 18}, &User{Name: "李四", Age: 20}, } insertSql, err := tdMapper.ToInsertSQL(data...) if err != nil { t.Fatal(err) } fmt.Println(insertSql) } ------------------------------------------------------ INSERT INTO `user_张三` USING `super_user` (`name`) TAGS ('张三') (`age`) VALUES (18) `user_李四` USING `super_user` (`name`) TAGS ('李四') (`age`) VALUES (20) ``` ### 查询映射 -- 示例 ```go func QueryOne(db *sql.DB) (*User,error){ tdMapper := NewMapper() rows,err:=db.Query("select * from User limit 100") if err!=nil { return err } def rows.Close() var user User if err:=ScanRows(&user,rows);err!=nil { return err } return &user, nil } // 如果查询结果数量为0,则返回 sql.ErrNoRows // var ErrNoRows = errors.New("sql: no rows in result set") func QueryAll(db *sql.DB)([]*User, error) { tdMapper := NewMapper() rows,err:=db.Query("select * from User limit 100") if err!=nil { return err } def rows.Close() var users []*User if err:=ScanRows(&users,rows);err!=nil { return err } return &users, nil } ```