什么做网站,舞台灯光网站建设,模板网站做外贸可以吗,温州seo方法本质上是可以动态获取程序运行时的变量#xff08;类型#xff09;
比如现在我想实现一个通用的db插入函数#xff0c;支持我传入所有类型的struct#xff0c;每一种类型的struct是一个单独的表#xff0c;以struct的名称作为表名#xff0c;然后插入到不同的表中。
pa…本质上是可以动态获取程序运行时的变量类型
比如现在我想实现一个通用的db插入函数支持我传入所有类型的struct每一种类型的struct是一个单独的表以struct的名称作为表名然后插入到不同的表中。
package mainimport (database/sqlfmtreflect_ github.com/go-sql-driver/mysql // MySQL driver
)// User 示例用户结构体
type User struct {ID int db:idName string db:nameEmail string db:email
}func main() {db, err : sql.Open(mysql, user:passwordtcp(localhost:3306)/dbname)if err ! nil {panic(err)}defer db.Close()// 用户提供的任意结构体实例user : User{Name: Alice,Email: aliceexample.com,}// 使用反射保存用户实例save(db, user)
}// save 通用保存函数接受任何结构体实例作为参数
func save(db *sql.DB, model interface{}) error {// 获取结构体实例的反射值和类型val : reflect.ValueOf(model).Elem()typ : val.Type()// 构建INSERT SQL语句var columns []stringvar values []interface{}for i : 0; i typ.NumField(); i {field : typ.Field(i)columns append(columns, field.Tag.Get(db))values append(values, val.Field(i).Interface())}query : fmt.Sprintf(INSERT INTO %s (%s) VALUES (%s),typ.Name(), // 使用结构体名作为表名strings.Join(columns, , ),strings.Repeat(?, , len(columns)-1)?) // 参数占位符// 执行SQL语句result, err : db.Exec(query, values...)if err ! nil {return err}// 返回受影响行数或其他信息affected, err : result.RowsAffected()if err ! nil {return err}fmt.Printf(Saved %d rows.\n, affected)return nil
}