我正在编写一个服务,必须将已执行命令的输出流式传输到父级和日志.当有一个漫长的过程时,问题是cmd.StdoutPipe给我一个最终的(字符串)结果.
是否可以给出正在发生的事情的部分输出,比如在shell中
func main() {
cmd := exec.Command("sh", "-c", "some long runnig task")
stdout, _ := cmd.StdoutPipe()
cmd.Start()
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
m := scanner.Text()
fmt.Println(m)
log.Printf(m)
}
cmd.Wait()
}
Run Code Online (Sandbox Code Playgroud)
PS只是输出将是:
cmd.Stdout = os.Stdout
Run Code Online (Sandbox Code Playgroud)
但就我而言,这还不够.
我有一个用go编写的网络服务器,我正在提供来自不同来源(本地,其他服务器,S3)的一些音频文件.我想为这些文件启用部分内容,以便HTML音频标签能够搜索和循环.
我怎么能得到这个?我知道http包ServeContent函数可以做到这一点,但我怎么能通过自己提供文件来实现呢?我需要在没有这个的情况下这样做,以便我可以使用相同的处理程序提供来自不同来源的文件.
当我定义一个自定义类型时,似乎底层类型的类型对我是否可以将其传递给函数或我需要转换它有所不同.
问题是:
为什么RuneFunc和StringMap有效,但不是Integer?
https://play.golang.org/p/buKNkrg5y-
package main
type RuneFunc func(rune) rune
type Integer int
type StringMap map[string]string
func main() {
//m := make(StringMap)
//mf(m)
var i Integer = 5
nf(i)
//var f func(rune) rune
//ff(f)
}
func mf(i map[string]string) {
}
func ff(i func(rune)rune) {
}
func nf(i int) {
}
Run Code Online (Sandbox Code Playgroud)
在这里,当我运行这个函数调用nf与Integer它抱怨,虽然int是基础类型.但是当我打电话mf或ff他们成功运行时.
我正在尝试为REST API编码一些JSON,除了一些错误之外,一切正常.例如,使用此结构:
type TemplateResponse struct {
Message string
Error error
Template Template
}
Run Code Online (Sandbox Code Playgroud)
编码此数据:
res := TemplateResponse{"Template not found.", fmt.Errorf("There is no template on this host with the name " + vars["name"]), Template{}}
json.NewEncoder(w).Encode(res)
Run Code Online (Sandbox Code Playgroud)
返回:
{
"Message": "Template not found.",
"Error": {},
"Template": {
"Name": "",
"Disabled": false,
"Path": "",
"Version": ""
}
}
Run Code Online (Sandbox Code Playgroud)
我在应用程序中看起来似乎是随机的,其中'error'类型被返回为空.有任何想法吗?
谢谢!
我正在打印浮点值(例如:52.12:),如下所示:
fmt.Sprintf("%.2f%s", percentageValue, "%%")
Run Code Online (Sandbox Code Playgroud)
输出就像52.12%.但我想用英文以外的其他语言打印,小数点是逗号,.如何在Go中使用fmt.Sprintf.我想要这样的输出52,12%.
我试图解决可以在这里找到的SPOJ问题
以下是我的解决方案:
package main
import "fmt"
import "bufio"
import "os"
func main() {
var n, k int
var num int
var divisible int
in := bufio.NewReader(os.Stdin)
fmt.Fscan(in, &n)
fmt.Fscan(in, &k)
for n > 0 {
fmt.Fscan(in, &num)
if num%k == 0 {
divisible++
}
n--
}
fmt.Println(divisible)
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常.这里的问题是我在SPOJ中执行它时会出现超时.
我是第一次使用,fmt.Scan但后来我遇到了这个线程,建议我使用bufio更快的输入扫描.
但我仍然遇到超时问题.我只是循环以获取所有输入,并且在此循环内我确定输入是否可被整除.所以,我认为它不是循环,而是输入扫描需要时间.如何改进这一点以更快地读取输入?或者是其他地方的问题?
有一种简单的方法可以将数字转换为字母吗?
例如,
3=> "C"和23=> "W"?
我需要检查接口值是否为"nil".
但通过使用反射,它给了我一个错误:
反映:在struct Value上调用reflect.Value.Bool.
通过nil它没有给人一种错误的nil价值.
我正在golang中编写http Handlers的单元测试.在查看代码覆盖率报告时,我遇到了以下问题:从请求中读取请求正文时,ioutil.ReadAll可能会返回我需要处理的错误.然而,当我为我的处理程序编写单元测试时,我不知道如何以一种会触发这种错误的方式向我的处理程序发送请求(内容的过早结束似乎不会产生这样的错误但会产生错误解构身体).这就是我想要做的:
package demo
import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func HandlePostRequest(w http.ResponseWriter, r *http.Request) {
body, bytesErr := ioutil.ReadAll(r.Body)
if bytesErr != nil {
// intricate logic goes here, how can i test it?
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
defer r.Body.Close()
// continue...
}
func TestHandlePostRequest(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(HandlePostRequest))
data, _ := ioutil.ReadFile("testdata/fixture.json")
res, err := http.Post(ts.URL, "application/json", bytes.NewReader(data))
// continue...
}
Run Code Online (Sandbox Code Playgroud)
如何编写测试用例HandlePostRequest还包括bytesErr不存在的情况nil?
我刚刚意识到可以在一个语句中进行映射查找和类型/接口断言.
m := map[string]interface{}{
"key": "the value",
}
if value, ok := m["key"].(string); ok {
fmt.Printf("value exists and is a string: %s\n", value)
} else {
fmt.Println("value does not exist or is not a string")
}
Run Code Online (Sandbox Code Playgroud)
这被认为是坏事吗?我没有看到任何官方文件评论这一点.
编辑:我知道这段代码无法区分"密钥不存在"和"值是不正确的类型".
edit2:ahem,else子句中的print是不正确的:(
go ×10
string ×3
http ×2
character ×1
dictionary ×1
execution ×1
idiomatic ×1
interface ×1
json ×1
localization ×1
null ×1
reflection ×1
server ×1
struct ×1
types ×1
unit-testing ×1