我有一个写入/更新json的函数。但是我需要停止可执行文件,再次运行go build并重新运行可执行文件以在URL中更新json。
例如,我有一个Handler.go文件,该文件将URL中的参数作为键并运行if条件并更新json。所以如果构建可执行文件之前的json值是{“Name”:“Sneha”}并且我在url中传递参数“Nair”,则json在服务器中更新为{“Name”:“Nair”},但是没有得到在URL中更新。所以我必须停止可执行文件,再次运行go build并再次运行可执行文件以反映URL中的新json值{“Name”:“Nair”}。
1。有人可以提出另一个想法吗?
2。我们可以在函数内运行构建或更新吗?
非常感谢。
PS:我有goagain.go的网址。但我不确定这是否符合我的要求。
Handler.go
func handler(w http.ResponseWriter, r *http.Request) {
keys, ok := r.URL.Query()["key"]
if !ok || len(keys) < 1 {
log.Println("Url Param 'key' is missing")
return
}
key := keys[0]
log.Println("Url Param 'key' is: " + string(key))
if key == "java" {
commands := []string{
"Version=`java -version`",
"sed -i -e 's/^\\( *Name: *\\) .*$/ Name:\"Java\",/' Handler.go",
"sed -i -e 's/^\\( *Version: *\\) .*$/ Version:\" '$Version'\",/' Handler.go",
}
exe_cmd(commands)
}
if key == "go" {
commands := []string{
"Version=`go version`",
"sed -i -e 's/^\\( *Name: *\\) .*$/ Name:\"Go\",/' Handler.go",
"sed -i -e 's/^\\( *Version: *\\) .*$/ Version:\" '$Version'\",/' Handler.go",
}
exe_cmd(commands)
}
GetHands := GetHand{
Name:"java",
Version:" 1.7.0_71",
}
if err := json.NewEncoder(w).Encode(GetHands); err != nil {
panic(err)
}
所以在运行这个包时,url显示json值:{“name”:“java”,“version”:“1.7.0_71”} 如果我调用url:http://localhost:8080/?key=go,则此Handler.go会更新为,
GetHands := GetHand{
Name:"go",
Version:" 1.9",
}
如果我停止可执行文件, 再次运行go build并再次运行可执行文件,url返回为:{“name”:“go”,“version”:“1.9”}
所以基本上我需要动态url,在点击http:/ localhost /?key = go时会返回go的相应值和htpp:// localhost /?key = java会返回java的相应值。这应该在不重新启动可执行文件或重新运行go build
的情况下实现答案 0 :(得分:1)
很难准确理解你想要的东西。但我怀疑这只是想要从shell命令中提取输出并将其写入JSON。
为此,无需修改Handler.go文件或执行 @Override
protected byte[] doInBackground(Void... voids) {
Looper.prepare();
byte[] byteimage = new byte[0];
Bitmap bmp1;
try {
bmp= Glide.with(specificrecipe.this)//bmp is global
.load(url2img)
.asBitmap()
.into(100,100)
.get();
byteimage=getBytes(bmp);//here I'm not getting the image in bmp
//ByteArrayOutputStream stream = new ByteArrayOutputStream();
//bmp.compress(Bitmap.CompressFormat.PNG, 0, stream);//null object refrence -> bmp
//byteimage=stream.toByteArray();
//byteimage1.add(0,byteimage);
// initialize(bmp);
}catch (final ExecutionException e){e.printStackTrace();}
catch (final InterruptedException e){e.printStackTrace();}
return byteimage;
}
//@Override
//protected void onPostExecute(byte[] Bytearray){
//byteimage1=Bytearray;
//}
}.execute();
。您可以直接将输出写入go build
结构。
一个基本的例子如下:
GetHand
答案 1 :(得分:0)
您所有sed
的当前代码都试图修改您的源代码。它不起作用。一些古老的做法(通常使用bash)实际上做了那种工作,但它已经过时且有问题。
至于go,你肯定知道go是编译语言,它将源代码编译成二进制文件。这样,对源代码的任何修改都不会影响二进制文件,并导致进程运行时不知道这一点。从这个意义上讲,通过流程修改源代码本身就是错误和无效的。即使可以使用编译器来重建二进制文件,它也会既危险又低效。不要这样做。
在您指定的情况下,有一个更好,更常见的做法:变量。你肯定每天都用它。将GetHands
的字段设置为所需值是最简单的。通过这样做,您对每个请求(您称之为URL,但它是错误的)的响应将会更改,因为GetHands的字段更改为变量。
我写下面的代码:
import (
"os/exec"
"regex"
"runtime"
)
var pattern = regexp.MustCompile(`version \"(.+)\"`)
func GetJavaVersion() string {
cmd := exec.Command("Java", "-version")
out, err := cmd.Output()
if err != nil {
panic(err)
}
return string(pattern.FindSubmatch(out)[1])
}
func GetGoVersion() string {
return runtime.Version()[2:]
}
func handler(w http.ResponseWriter, r *http.Request) {
keys, ok := r.URL.Query()["key"]
if !ok || len(keys) < 1 {
log.Println("Url Param 'key' is missing")
return
}
key := keys[0]
log.Println("Url Param 'key' is: " + string(key))
var GetHands GetHand
if key == "java" {
GetHands = GetHand{Name: "java", Version: GetJavaVersion()}
}
if key == "go" {
GetHands = GetHand{Name: "go", Version: GetGoVersion()}
}
if err := json.NewEncoder(w).Encode(GetHands); err != nil {
panic(err)
}
}
因此,对于go,您可以通过包runtime
实时获取版本信息,但信息以“go”开头。你可以简单地切片。对于java,您必须运行命令:与您的原始代码相同:java -version
。但是,不是将其传递给sed
,而是使用Command.Output
从中获取输出,然后使用regexp
查找版本信息。 regexp
是从字符串中获取信息的非常有用的工具。你可以阅读它here