我一直试图在GoLang中将大字符串存储到字符串变量中,但是由于某些未知原因,GoLang将字符串的长度限制为64个字节
此字符串串联的主要目的是在运行时根据用户输入生成一个沙发床的N1QL查询
1 2 3 4 | userInput := []string{"apple","boy","cat","dog"} var buffer string buffer ="SELECT * FROM DB WHERE DB.ITEM_NAME="+userInput[0]+ "OR DB.ITEM_NAME="+userInput[1] |
在这种情况下,如果我在变量缓冲区上进行调试,例如,我可以看到它仅包含直到" SELECT * FROM DB WHERE DB.ITEM_NAME =" + userInput [0] + OR",具体取决于用户输入的大小,并且会有所不同。 字符串到第64个字符
- 显示演示该问题的工作代码。 发布的代码无法编译,但是在纠正错误后可以正常工作。
- 确保添加了工作代码:)
- 也许问题在于您的调试。 如果只打印或记录缓冲区,您将看到完整的字符串。
- @SudeshGutta请参阅play.golang.org/p/bnsGmejlyu。 那该怎么办呢?
-
@CeriseLimn:例如,
DB.ITEM_NAME=appleOR 几乎可以肯定是错误的。 -
@CeriseLimn:由于Go字符串的大小由
int 表示-32位系统为千兆字节,对于64位系统为EB-64字节限制的概念显然是荒谬的。 - 是的,这很荒谬。 我的评论的目的是向OP展示字符串操作按预期工作并且问题出在其他地方。
- 它是截断字符的调试器...谢谢大家的支持:-)
该行为是预期的。 行为并不奇怪。
您的代码创建了明显错误的Couchbase N1QL:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main import ( "fmt" ) func main() { userInput := []string{"apple","boy","cat","dog"} var buffer string buffer ="SELECT * FROM DB WHERE DB.ITEM_NAME=" + userInput[0] + "OR DB.ITEM_NAME=" + userInput[1] fmt.Println(buffer) } |
输出:
1 | SELECT * FROM DB WHERE DB.ITEM_NAME=appleOR DB.ITEM_NAME=boy |
这是一个可行的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main import ( "fmt" ) func main() { userInput := []string{"apple","boy","cat","dog"} query := fmt.Sprintf( `SELECT * FROM DB WHERE DB.ITEM_NAME=%q OR DB.ITEM_NAME=%q;`, userInput[0], userInput[1], ) fmt.Println(query) } |
输出:
1 | SELECT * FROM DB WHERE DB.ITEM_NAME="apple" OR DB.ITEM_NAME="boy"; |
注意:当心SQL注入。
参考文献:
Go编程语言规范
Couchbase:查询语言教程
Couchbase:使用N1QL查询