मैं हर जगह इस कोड के रूपांतरों देखा है, लेकिन यह कुछ परीक्षण सेट के लिए मेरे लिए काम नहीं करता।
यहां कुछ लिखा है जो मैंने लिखा है कि सभी टेस्ट वैल्यू जो मैंने फेंक दिया है (परीक्षण के मामलों का पालन करें)। यह लगभग 80% तेज है।
func ParsePGArray(array string) ([]string, error) {
var out []string
var arrayOpened,quoteOpened,escapeOpened bool
item := &bytes.Buffer{}
for _, r := range array {
switch {
case !arrayOpened:
if r != '{' {
return nil, errors.New("Doesn't appear to be a postgres array. Doesn't start with an opening curly brace.")
}
arrayOpened = true
case escapeOpened:
item.WriteRune(r)
escapeOpened = false
case quoteOpened:
switch r {
case '\\':
escapeOpened = true
case '"':
quoteOpened = false
if item.String() == "NULL" {
item.Reset()
}
default:
item.WriteRune(r)
}
case r == '}':
// done
out = append(out, item.String())
return out, nil
case r == '"':
quoteOpened = true
case r == ',':
// end of item
out = append(out, item.String())
item.Reset()
default:
item.WriteRune(r)
}
}
return nil, errors.New("Doesn't appear to be a postgres array. Premature end of string.")
}
यहाँ परीक्षण मामलों रहे हैं:
scanTests := []struct {
in string
out []string
}{
{"{one,two}", []string{"one", "two"}},
{`{"one, sdf",two}`, []string{"one, sdf", "two"}},
{`{"\"one\"",two}`, []string{`"one"`, "two"}},
{`{"\\one\\",two}`, []string{`\one\`, "two"}},
{`{"{one}",two}`, []string{`{one}`, "two"}},
{`{"one two"}`, []string{`one two`}},
{`{"one,two"}`, []string{`one,two`}},
{`{abcdef:83bf98cc-fec9-4e77-b4cf-99f9fb6655fa-0NH:zxcvzxc:wers:vxdfw-asdf-asdf}`, []string{"abcdef:83bf98cc-fec9-4e77-b4cf-99f9fb6655fa-0NH:zxcvzxc:wers:vxdfw-asdf-asdf"}},
{`{"",two}`, []string{"","two"}},
{`{" ","NULL"}`, []string{" ",""}},
}
कौन सा PostgreSQL डेटाबेस ड्राइवर आप उपयोग कर रहे हैं? क्या आपने इसके दस्तावेज के माध्यम से पढ़ा था (ऐसी सुविधा ड्राइवर द्वारा प्रदान की जाएगी)? ऐसा विफल होने पर, आप शायद एक टुकड़ा प्रकार बना सकते हैं जो ['sql.Scanner'] लागू करता है (https://golang.org/pkg/database/sql/#Scanner)। –
http://godoc.org/github.com/lib/pq का उपयोग करना ठीक है धन्यवाद, मैं उसमें देखता हूं, यह निराशाजनक है कि यह बॉक्स –
बीटीडब्लू के बाहर उपलब्ध नहीं है, आपको 'लेन (एआर)' 'स्कैन' से त्रुटि वापसी की जांच किए बिना (जो संभवतः कुछ ऐसा होगा: "प्रतिबिंबित करें। सेट: प्रकार का मान [] uint8 टाइप करने के लिए असाइन करने योग्य नहीं है [] स्ट्रिंग", यानी डेटाबेस ड्राइवर को कॉलम को '[] byte')। –