英文:
Incremented seconds not printing
问题
我正在学习谷歌Go语言(非常有趣),我用来学习的第一个程序是Matt Aimonetti的博客文章:
package main
import (
"fmt"
"net/http"
"time"
)
var urls = []string{
"http://golang.org",
"http://www.espn.com",
"http://www.google.com",
}
type HttpResponse struct {
url string
response *http.Response
err error
}
func asyncHttpGets(urls []string) []*HttpResponse {
ch := make(chan *HttpResponse)
responses := []*HttpResponse{}
seconds := 0
for _, url := range urls {
go func(url string) {
fmt.Printf("正在获取 %s \n", url)
resp, err := http.Get(url)
ch <- &HttpResponse{url, resp, err}
}(url)
}
for {
select {
case r := <-ch:
fmt.Printf("%s 已获取\n", r.url)
responses = append(responses, r)
if len(responses) == len(urls) {
return responses
}
case <-time.After(50 * time.Millisecond):
seconds++
fmt.Printf(".")
fmt.Sprintf("%v", seconds)
}
}
return responses
}
func main() {
results := asyncHttpGets(urls)
for _, result := range results {
fmt.Printf("%s 状态: %s\n", result.url, result.response.Status)
}
}
我想在输出中也打印出毫秒数,所以我在asyncHttpGets方法中创建了一个seconds变量,并在打印“.”的位置进行了递增。
然而,当我运行时它从未显示:
go build concurrency_example.go && ./concurrency_example
输出:
正在获取 http://golang.org
正在获取 http://www.espn.com
正在获取 http://www.google.com
...http://www.google.com 已获取
..http://golang.org 已获取
.........http://www.espn.com 已获取
http://www.google.com 状态: 200 OK
http://golang.org 状态: 200 OK
http://www.espn.com 状态: 200 OK
问题:
为什么秒数计数器没有被打印出来?
如何通过将毫秒转换为秒(作为整数)并转换为字符串来打印它?
这个例子和博客文章中的解释是一个很好的学习经验!
英文:
Am learning Google Go (very interesting, by the way) and the first program I used to learn was Matt Aimonetti's blog post:
package main
import (
"fmt"
"net/http"
"time"
)
var urls = [] string {
"http://golang.org",
"http://www.espn.com",
"http://www.google.com",
}
type HttpResponse struct {
url string
response *http.Response
err error
}
func asyncHttpGets(urls [] string) [] *HttpResponse {
ch := make(chan *HttpResponse)
responses := [] *HttpResponse{}
seconds := 0
for _, url := range urls {
go func(url string) {
fmt.Printf("Fetching %s \n", url)
resp, err := http.Get(url)
ch <- &HttpResponse{url, resp, err}
}(url)
}
for {
select {
case r := <-ch:
fmt.Printf("%s was fetched\n", r.url)
responses = append(responses, r)
if len(responses) == len(urls) {
return responses
}
case <- time.After(50 * time.Millisecond):
seconds++
fmt.Printf(".")
fmt.Sprintf("%v", seconds)
}
}
return responses
}
func main() {
results := asyncHttpGets(urls)
for _, result := range results {
fmt.Printf("%s status: %s\n", result.url, result.response.Status)
}
}
I wanted to see the milliseconds also printed in the output so I create a seconds variable inside the asyncHttpGets method and incremented it in the same place that prints the "."
However, it never displays when I run:
go build concurrency_example.go && ./concurrency_example
Outputs:
Fetching http://golang.org
Fetching http://www.espn.com
Fetching http://www.google.com
...http://www.google.com was fetched
..http://golang.org was fetched
.........http://www.espn.com was fetched
http://www.google.com status: 200 OK
http://golang.org status: 200 OK
http://www.espn.com status: 200 OK
Question(s):
Why isn't the seconds counter being printed?
How do I print it by converting milliseconds to seconds (as int) and then convert to string?
This example and the explanations in the blog post was a great learning experience!
答案1
得分: 3
问:为什么秒计数器没有被打印出来?
答:因为你使用了fmt.Sprintf,它返回一个格式化的字符串,而不是打印该字符串。你应该使用fmt.Printf。
问:如何通过将毫秒转换为秒(作为整数),然后再转换为字符串来打印它?
答:如果你有一个毫秒值,只需将其除以1000即可得到秒数。fmt.Printf会将其转换为字符串。
英文:
Q: Why isn't the seconds counter being printed?
A: Because you used fmt.Sprintf, which returns a formatted string; it doesn't print that string. Use fmt.Printf.
Q: How do I print it by converting milliseconds to seconds (as int) and then convert to string?
A: If you have a value in milliseconds, simply divide by 1000 to get seconds. fmt.Printf will convert it to a string for you.
答案2
得分: 3
- 你正在使用
fmt.Sprintf
,它返回一个字符串,而不是实际打印它,你应该使用fmt.Printf
。 - 只需使用
fmt.Println(ms/1000)
即可打印出秒数。
英文:
- You're using
fmt.Sprintf
, it returns a string, doesn't actually print it, you want to usefmt.Printf
- Simply
fmt.Println(ms/1000)
will print the seconds.
答案3
得分: 1
如其他人所提到的问题是你使用了fmt.Sprintf
,它根据格式(函数调用的第一个参数)格式化字符串。
将fmt.Sprintf("%v", seconds)
替换为fmt.Printf("%v\n", seconds)
以打印增量值,或者如果要打印毫秒,则替换为fmt.Printf("%v\n", seconds/1000)
。也就是说,更好/更准确的方法是使用time
包来获取函数开始和时间打印之间的经过时间,如下所示:
package main
import (
"fmt"
"net/http"
"time"
)
var urls = []string{
"http://golang.org",
"http://www.espn.com",
"http://www.google.com",
}
type HttpResponse struct {
url string
response *http.Response
err error
}
func asyncHttpGets(urls []string) []*HttpResponse {
ch := make(chan *HttpResponse)
responses := []*HttpResponse{}
for _, url := range urls {
go func(url string) {
fmt.Printf("Fetching %s \n", url)
resp, err := http.Get(url)
ch <- &HttpResponse{url, resp, err}
}(url)
}
start := time.Now()
for {
select {
case r := <-ch:
fmt.Printf("%s was fetched\n", r.url)
responses = append(responses, r)
if len(responses) == len(urls) {
return responses
}
case t := <-time.After(50 * time.Millisecond):
fmt.Println(t.Sub(start))
}
}
return responses
}
func main() {
results := asyncHttpGets(urls)
for _, result := range results {
fmt.Printf("%s status: %s\n", result.url, result.response.Status)
}
}
我们正在收集time.After
返回的计时器输出,并减去函数调用时设置的开始时间。我们最终得到一个time.Duration
值,可以以多种不同的方式打印。
英文:
As others mentioned the issue is that you used fmt.Sprintf which formats a string according to a format (the first argument of the function call).
Replace fmt.Sprintf("%v", seconds)
by fmt.Printf("%v\n", seconds)
to print the incremental value or fmt.Printf("%v\n", seconds/1000)
if you want to print milliseconds. That said a better/more accurate way to get the elapsed time between the start of the function and when the time prints the time would be to use the time
package as shown below:
package main
import (
"fmt"
"net/http"
"time"
)
var urls = []string{
"http://golang.org",
"http://www.espn.com",
"http://www.google.com",
}
type HttpResponse struct {
url string
response *http.Response
err error
}
func asyncHttpGets(urls []string) []*HttpResponse {
ch := make(chan *HttpResponse)
responses := []*HttpResponse{}
for _, url := range urls {
go func(url string) {
fmt.Printf("Fetching %s \n", url)
resp, err := http.Get(url)
ch <- &HttpResponse{url, resp, err}
}(url)
}
start := time.Now()
for {
select {
case r := <-ch:
fmt.Printf("%s was fetched\n", r.url)
responses = append(responses, r)
if len(responses) == len(urls) {
return responses
}
case t := <-time.After(50 * time.Millisecond):
fmt.Println(t.Sub(start))
}
}
return responses
}
func main() {
results := asyncHttpGets(urls)
for _, result := range results {
fmt.Printf("%s status: %s\n", result.url, result.response.Status)
}
}
We are collecting the timer output returned by time.After
and subtracting the start time we set when the function is called. We end up with a time.Duration
value which we can print many different ways.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论