मेरे पास एक छोटा गो प्रोग्राम है जो go list -json
कई संकुलों के लिए आदेश चलाता है, एक जेसन में कमांड के प्रत्येक रन के आउटपुट को स्टोर करता है। RawMessage , प्रत्येक जेसन को जोड़ता है। जेसन के एक टुकड़े में रौज मैसेज। रॉ मैसेज, और उसके बाद प्रत्येक जेसन को संयोजित करने के बाद सर्वर को परिणाम देता है। एक साथ संदेश और जेसन को कॉम्पैक्ट करना। हालांकि, एक त्रुटि संदेश है जो उत्पादित होता है जब मैं json.Compact
चलाता हूं कि मैं स्रोत का पता नहीं लगा सकता। इस त्रुटि संदेश को गुगल करने से पता चलता है कि ज्यादातर लोग इसे सामना करते हैं - चाहे वह अमान्य ,
या किसी अन्य चरित्र के लिए है - इसके स्रोत को ढूंढने में कठिन समय है। भी नीचे (हालांकि यह वहाँ नहीं चलेंगे) और"अमान्य चरित्र ',' मूल्य की शुरुआत की तलाश 'त्रुटि संदेश
invalid character ',' looking for beginning of value
टिप्पणी के साथ कोड यहाँ on play.golang.org देखने के लिए उपलब्ध है।
प्रश्न: क्या आप इस त्रुटि के स्रोत को समझ सकते हैं और इसे कैसे रोक सकते हैं?
(ध्यान दें, संकुल में से कुछ अभी परीक्षण प्रयोजनों के लिए शामिल किए गए)
package main
import (
"expvar"
"encoding/json"
"bytes"
"fmt"
"github.com/go-martini/martini"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
"go/build"
"log"
"math/rand"
"net/http"
_ "net/http/pprof"
"os/exec"
)
type myType struct {
J []json.RawMessage
}
var pack map[string]string
type GoList struct {
Imports []string
}
type Import struct {
Dir string
ImportPath string
Name string
Target string
Standard bool
Root string
GoFiles []string
Imports []string
Deps []string
}
const contentTypeJSON = "application/json"
func main() {
http.HandleFunc("/importgraph", func(w http.ResponseWriter, r *http.Request) { importGraph(w, r) })
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("Inside handler")
fmt.Fprintf(w, "Hello world from my Go program!")
}
func importGraph(w http.ResponseWriter, r *http.Request) {
pack = make(map[string]string)
var t myType
cmd := exec.Command("go", "list", "-json")
stdout, err := cmd.Output()
if err != nil {
println(err.Error())
return
}
var list GoList
err = json.Unmarshal(stdout, &list)
for _, d := range list.Imports {
//get the imports for each of the packages listed by go list -json
t.imports(d)
}
var buff bytes.Buffer
//concatenate the separate json.RawMessages together into json
buff.WriteByte('[')
for i, j := range t.J {
if i != 0 {
buff.WriteByte(',')
}
buff.Write([]byte(j))
}
buff.WriteByte(']')
var buffer bytes.Buffer
if err := json.Compact(&buffer, buff.Bytes()); err != nil {
println(err.Error()) //error message: invalid character ',' looking for beginning of value
return
}
w.Header().Set("Content-Type", contentTypeJSON)
w.Write(buffer.Bytes())
}
func (myObj *myType) imports(pk string) error {
cmd := exec.Command("go", "list", "-json", pk)
stdout, _ := cmd.Output()
pack[pk] = pk
var deplist Import
json.Unmarshal(stdout, &deplist)
var newj json.RawMessage
json.Unmarshal(stdout, &newj)
myObj.J = append(myObj.J, newj)
for _, imp := range deplist.Imports {
if _, ok := pack[imp]; !ok {
myObj.imports(imp) //recursive call to get the imports of the imports etc
}
}
return nil
}
त्रुटि के बारे में कोई और जानकारी? रेखा संख्या/कोई अतिरिक्त निशान? – Momer
'go list' कमांड [go/build] (http://godoc.org/go/build) पैकेज के चारों ओर एक रैपर है। मैं 'go list' कमांड को निष्पादित करने के बजाय आयात प्राप्त करने के लिए अपने एप्लिकेशन से 'build.DefaultContext.Import (पथ," ", 0) 'कॉल करने का सुझाव देता हूं। –
@ मॉमर यह एक लाइन नंबर नहीं देता है, न ही एक निशान। क्या कोई निशान बनाने का कोई तरीका है? – Leahcim