在Golang中将结构与数据库创建绑定

How to bind data struct with database creation in Golang along with its tags/flags.

For example I have this code:

type User struct {
    ID      int     `sql:"primary_key;AUTO_INCREMENT"`
    Name    string  `sql:"type:varchar(100);unique"`
    Email   string  `sql:"type:varchar(100);unique"`
    Address string  `sql:"type:varchar(100)"`
}

When creating the database which should be based on this struct, I instead manually create it like this:

func (db *DB) CreateUserTable() (sql.Result, error) {

    statement := "CREATE TABLE IF NOT EXISTS %s (%s int, %s varchar, %s varchar, %s varchar)"
    return db.Exec(
        fmt.Sprintf(statement,
            "user",
            "id",
            "name",
            "email",
            "address",
        ),
    )
}

How to bind the struct and its tags(primary key, NULL, etc) in database creation?. Is there best practice for it without using ORM libraries(gorm,etc)?

You can use reflect to examine the struct and use it to construct your database query.

For example:

If you want to read struct's name to use it as table name:

tableName := reflect.TypeOf(your-struct).Name()

If you want to read struct's properties, loop and read it by using:

val := reflect.ValueOf(your-struct)
for i:=0; i < val.NumField(); i++ {
    field := val.Type().Field(i)
    tag := field.Tag

    fieldType := field.Type // get struct's variable type
    fieldName := field.Name //get struct variable's name
    fieldByTag1 := tag.Get("your-tag") // get struct tag's name 
    fieldByTag2 := tag.Get("your-another-tag") // get another struct tag's name(if you have more)
}

Note that struct's tags are the one inside back tick -> `

That's all you need to get from a struct. You should explore more in the documentation.