Golang中channel测试示例代码解析与实现

Golang中channel测试示例代码解析与实现 github.com

JustinObanor/golang-channel-test/blob/feature/SBX-001/main.go

package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)

var wg sync.WaitGroup

type widget struct {
	Label string
	Time  time.Time
}

func main() {
	c := make(chan widget)

此文件已被截断。显示完整内容

我的接收函数应该输出结构体中的数据,也就是字符串和时间。它确实这样做了,但在时间后面添加了一些非常奇怪的内容 - +0300 +03 m=+0.001997101 我不知道这是什么,我需要移除它。


更多关于Golang中channel测试示例代码解析与实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

你使用的是哪个操作系统?哪个 Go 版本?…

更多关于Golang中channel测试示例代码解析与实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢,这个方法奏效了。

func main() {
    fmt.Println("hello world")
}
chanValue := <-c
t := chanValue.Time
w := chanValue.Label
fmt.Println("[", w, t.Format("15:04:05.000000"), "]")

遗憾的是我的输出不是这样的:

{widget_id_34 2019-08-28 11:41:26.9215223 +0300 +03 m=+0.002998401}

这是我得到的结果

在我的系统中运行正常。显示如下:

PS C:\temp\GolangProjects\test> go run t.go
Send : {widget_id_34 10:57:05.549990}
Receive: {widget_id_34 10:57:05.549990}

这是单调时钟。文档中提到:

去除单调时钟读数的标准方法是使用 t = t.Round(0)。

尝试将第54行改为:

fmt.Println("[", w, t.Round(0).Format("15:04:05.000000"), "]")

在Go语言中,当您使用time.Time类型的默认格式化输出时,会包含时区信息和单调时钟读数(如+0300 +03 m=+0.001997101)。要仅显示时间数据而不包含这些额外信息,您需要使用自定义的时间格式化。

以下是修改后的接收函数示例,使用Format方法指定输出格式:

func receiver(c chan widget) {
    defer wg.Done()
    for w := range c {
        // 使用自定义格式输出时间,移除时区和单调时钟信息
        formattedTime := w.Time.Format("2006-01-02 15:04:05")
        fmt.Printf("Label: %s, Time: %s\n", w.Label, formattedTime)
    }
}

关键点:

  • Format("2006-01-02 15:04:05") 使用Go的特定参考时间格式进行格式化
  • 参考时间必须是:Mon Jan 2 15:04:05 MST 2006(对应数字:2006-01-02 15:04:05)

如果您需要其他时间格式,可以调整格式字符串:

// 仅显示日期
formattedTime := w.Time.Format("2006-01-02")

// 显示更详细的时间(包含毫秒)
formattedTime := w.Time.Format("2006-01-02 15:04:05.000")

// 使用ISO 8601格式
formattedTime := w.Time.Format(time.RFC3339)

这样修改后,输出将只包含您需要的标签和格式化后的时间,不再显示时区和单调时钟信息。

回到顶部