2017-02-15 24 views
-4

我一直試圖在GoLang中將大字符串存儲到字符串變量中,但由於某些未知原因,GoLang將字符串限制爲64字節長度奇怪的行爲GoLang限制將字符串存儲到一個變量爲64字節長度

這個字符串連接的主要目的是根據用戶的輸入

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] 

在運行時生成couchbase的N1QL查詢在這種情況下,如果我調試在可變緩衝器中,例如我可以看到它僅包含直到「 SELECT * FROM DB WHERE DB.ITEM_NAME =「+ userInput [0] + OR」取決於用戶輸入大小的不同,它將字符串限制爲第64個字符

+2

顯示工作代碼,演示了這個問題。發佈的代碼不會編譯,但會在糾正錯誤時按預期工作。 –

+0

當然加了工作代碼:) –

+2

也許問題在於你的調試。如果您只是打印出或記錄緩衝區,您將看到完整的字符串。 – geraldss

回答

2

行爲與預期的一樣。行爲並不奇怪。

你的代碼創建顯然是錯誤的Couchbase N1QL:

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) 
} 

輸出:

SELECT * FROM DB WHERE DB.ITEM_NAME=appleOR DB.ITEM_NAME=boy 

這裏是一個可能的解決辦法:

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) 
} 

輸出:

SELECT * FROM DB WHERE DB.ITEM_NAME="apple" OR DB.ITEM_NAME="boy"; 

注意:注意SQL注入。

參考文獻:

The Go Programming Language Specification

Couchbase: Query Language Tutorial

Couchbase: Querying with N1QL