//此时Joins不起作用 
db.Table("book").
    Where("book.id = ?",1).
    Update("book.title","test")

生成sql为 `update book set book.title = 'test' where book.id = 1`  

//正确方法 
db.Table("book inner join category on book.category_id = category.id").
    Where("book.id = ?",1).
    Update("book.title","test")

生成sql为 `update book inner join category on book.category_id = category.id set book.title = 'test' where book.id = 1`  


package main

import (
	"fmt"
	"strings"
)

func main() {
	fmt.Println(len(strings.Split("","")))
	fmt.Println(len(strings.Split("",",")))
	fmt.Println(strings.Split("",",")[0] == "")
}

输出结果:

0
1
true


因为对接阿里云开放搜索是因为没有go的sdk,所以自己根据阿里云的帮助文档写了调用搜索接口的方法、后来发现使用filter参数并且filter参数中带有空格时阿里云返回签名失败。

经过查看阿里云开放搜索php的sdk源码后发现阿里云对url参数转义的时候空格会被转义成 "%20",而go的url.QueryEscape函数被把空格转义成 "+"。阿里云代码如下图。



经过测试发现

php中url_encode和http_build_query函数转义时采用的是RFC1738规范(空格会被转义成 "+" 号)。其中http_build_query函数可传参数使用其它规范 http_build_query($params, '', '&', PHP_QUERY_RFC3986)。RFC3986规范会将空格转义成 "%20"。测试php见下图



go中url.QueryEscape函数会将空格转义成 "+"  而url.PathEscape函数会将空格转义成 "%20"。测试代码见下图