我有可以在我的应用程序中使用的可空变量,并且还发送到具有默认为null的列的数据库。
这是一个示例结构:
// Location type
type Location struct {
ID int `schema:"id"`
Title *string `schema:"title"`
}
标题定义为* string,因为它可能为null(例如,没有用户输入或客户端应用程序将其作为null发送)。
这是我的函数接收表单数据:
// JSONLocationCreate func
func (a *App) JSONLocationCreate(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var e Location
err := decoder.Decode(&e, r.PostForm)
if err != nil {
respondWithError(w, http.StatusBadRequest, "Invalid request payload")
return
}
// --- SUCCESS ---
// If e.Title has data, the following line works.
// --- FAIL ---
// If e.Title doesn’t have data (for whatever reason), it’s null, and crashes the app:
log.Println(*e.Title)
// Ultimately the variable would be sent off to a database.
// Below I’m removing other functions and such, just including my statement line.
// --- SUCCESS ---
// If e.Title has data, the following line works.
// --- FAIL ---
// If e.Title is null (e.g. no user input), this crashes the app.
statement := fmt.Sprintf("INSERT INTO locations(title) VALUES('%s')", *e.Title)
// In either case, the crash error is similar to this:
// panic serving [::1]:52459: runtime error: invalid memory address or nil pointer dereference
}
关注1:如何在整个应用程序中使用可空变量(如e.Title),而不会在变量为空时抛出恐慌错误?最好的做法是将它包装在一个将null转换为“”字符串的函数中吗?如何透明地应用这样的函数,所以我不必在变量的每个实例上都有类似“nullCheck(* e.Title)”的东西?
关注2:对于我的数据库查询,我不能将“”字符串值发送到数据库中代替空值。到目前为止,我的查询是手动构建的。我想我需要一个函数来生成SQL查询,当变量为空时自动排除列和变量。
我是否在正确的轨道上?有什么例子吗?
在搜索数小时后,我还没有理解所有的主题/教程。
答案 0 :(得分:0)
通过为您的字段添加getter方法
可以轻松解决问题1func (l Location) GetTitle() string {
if l.Title == nil {
return ""
}
return *l.Title
}
关注2: 这取决于你想要做什么SQL查询,我建议你研究一些ORM库,它们为你自动化了很多特定于数据库的代码。 Gorm是这种库的一个很好的例子:https://github.com/jinzhu/gorm