Make文件中赋值等号的几种类型(:=,?=,=)

今天有一位以前仅做过Android APP开发的同学突然间问我,说Makefile中经常可以看见:冒号等号(:=)、问号等号(?=)和直接等号(=)。这究竟有什么区别呢?
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu

突然想到团队中其实有些同学以前没有做过Android整个源码树或者native代码的修改和开发,因此对Makefile有些陌生。这里简单的介绍一下三者的区别,其实非常简单:

1) ?=: 条件赋值(conditional variable assignment),如果变量已经赋值,则不要重新赋值;
2) :=: 立即赋值(immediately assignment),变量取值立即展开;
3) =: 递归展开赋值(recursively expanded assignment),该变量在使用的时候才对表达式进行展开;

对于后面的2)、3),稍微难以理解一点,但是只要我给出下面的表达式大家立即就会理解了:
VAR1 = $VAR2 + postfix
对头,区别就是如果变量的表达式中包含另外的变量如何处理。立即赋值立刻取值展开,以后VAR1和VAR2就没有关系了;递归展开赋值在后面使用VAR1的时候才真正根据VAR2的取值来计算,
如果期间VA
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以尝试使用预编译语句来优化 SQL 查询性能,同时使用占位符来避免 SQL 注入攻击。改进后的代码如下所示: ```go stmt, err := db.DB().Prepare("SELECT * FROM flaws WHERE facility_id = ? " + "UNION SELECT * FROM issues WHERE facility_id = ? " + "UNION SELECT * FROM records WHERE facility_id = ? " + "UNION SELECT * FROM qualities WHERE facility_id = ? " + "UNION SELECT * FROM inspections WHERE facility_id = ? " + "LIMIT ? OFFSET ?") if err != nil { // 处理错误 } defer stmt.Close() req := make([]*Total, 0) offset := (page - 1) * pageSize limit := pageSize rows, err := stmt.Query(code, code, code, code, code, limit, offset) if err != nil { // 处理错误 } defer rows.Close() for rows.Next() { var item Total err := rows.Scan(&item) if err != nil { // 处理错误 } req = append(req, &item) } if err := rows.Err(); err != nil { // 处理错误 } res := db.Model(&Total{}).Where("facility_id = ?", code).Count(&Total{}) // 处理结果 ``` 这里我们使用了 `db.DB().Prepare()` 方法来预编译 SQL 查询语句,并使用占位符 `?` 来代替变量,从而避免了 SQL 注入攻击。 同时,我们也将分页查询的 `LIMIT` 和 `OFFSET` 参数移到了 SQL 查询语句,以避免使用 `Scopes()` 方法产生额外的查询开销。在查询结果时,我们使用 `stmt.Query()` 方法来执行查询,并使用 `rows.Scan()` 方法将查询结果映射到结构体。 最后,我们使用 `db.Model().Where().Count()` 方法来查询总记录数,并将结果返回给调用者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值