Golang实现循环计数并生成带递增数字的字符串(如"Widget_number")

Golang实现循环计数并生成带递增数字的字符串(如"Widget_number")

for i := 0; i < 10; i++ {
	//v := counter + 1
	producer1 := widget{
		"Widget_",
		time.Now(),
	}
	time.Sleep(time.Second * 5)
	p <- producer1
}

以下是结构体定义,但我不应该更改类型:

type widget struct {
	Label string
	Time  time.Time
}
8 回复

结果应该类似这样: Widget_1 Widget_2 等等

更多关于Golang实现循环计数并生成带递增数字的字符串(如"Widget_number")的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢。现在可以正常工作了。我还有很多需要学习的地方,希望我不会中途放弃。

你将 v 重置为 counter 的值 0。为什么不直接使用 i 呢?

那么如果你不想直接打印而是需要字符串形式,可以使用 fmt.Sprintf 来创建标签。或者你也可以使用 strconv 包中的函数并拼接字符串。

func main() {
    fmt.Println("hello world")
}

我不太确定是否真正理解了你想做什么……

但是仅仅递增某个数字并打印出来是相当简单的,特别是因为你已经在使用带有递增计数器的 for 循环……

for i := 0; i < 10; i++ {
  fmt.Println("widget_%d", i)
}

不确定你使用通道的目的是什么,或者那个结构体应该做什么……

感谢,我已经取得了很大进展。现在的问题是循环中我的数字没有递增

func send(p chan<- widget) {
counter := 0
for i := 0; i < 10; i++ {
v := counter
v++
const label = "Widget_"
producer1 := widget{
fmt.Sprintf("%s %d", label, v),
time.Now(),
}
time.Sleep(time.Second)
p <- producer1
}
}

试图说明我并非在fmt.Println语句中递增数字,而是递增数字并将其连接到字符串标签(widget_#)中,需要将数字放在#的位置。

producer1 := widget{
	"Label":"Widget_#",
	"time":time.Now(),
}
time.Sleep(time.Second * 5)
p <- producer1
}

在每次循环中通过通道打印结构体时,数字会持续累加…希望您能理解

以下是针对您需求的Go语言实现方案,通过循环计数生成带递增数字的字符串(如"Widget_1"、"Widget_2"等)。我注意到您的原始代码中缺少计数器逻辑,且字符串标签没有包含数字部分。

for i := 0; i < 10; i++ {
    producer1 := widget{
        Label: fmt.Sprintf("Widget_%d", i+1), // 使用fmt.Sprintf构建带数字的字符串
        Time:  time.Now(),
    }
    time.Sleep(time.Second * 5)
    p <- producer1
}

关键改进说明:

  1. 使用fmt.Sprintf("Widget_%d", i+1)将循环索引转换为从1开始的数字并拼接到字符串中
  2. 保持了原始结构体类型不变
  3. 循环10次,每次生成格式为"Widget_1"到"Widget_10"的字符串

完整可运行示例:

package main

import (
    "fmt"
    "time"
)

type widget struct {
    Label string
    Time  time.Time
}

func main() {
    p := make(chan widget, 10) // 创建带缓冲的channel
    
    go func() {
        for i := 0; i < 10; i++ {
            producer1 := widget{
                Label: fmt.Sprintf("Widget_%d", i+1),
                Time:  time.Now(),
            }
            time.Sleep(time.Second * 1) // 缩短等待时间便于测试
            p <- producer1
        }
        close(p)
    }()
    
    // 从channel读取结果
    for w := range p {
        fmt.Printf("Label: %s, Time: %v\n", w.Label, w.Time)
    }
}

输出结果示例:

Label: Widget_1, Time: 2023-10-05 10:30:45.123456789 +0000 UTC
Label: Widget_2, Time: 2023-10-05 10:30:46.123456789 +0000 UTC
...
Label: Widget_10, Time: 2023-10-05 10:30:54.123456789 +0000 UTC

这个实现确保了每个widget都有唯一的递增数字标识,同时保持了5秒的间隔生产节奏。

回到顶部