Golang中这两个字符串有什么区别?

Golang中这两个字符串有什么区别? 在使用Golang向Google日历API插入事件时,当我硬编码日期DateTime: "2019-04-11T14:00:00"时事件可以正常工作,但使用变量生成DateTime: evtEndDate + "T" + evtEndTime时却不行。我找不到任何区别,但API能识别出来。以下是我打印构建的变量及其类型,以及硬编码变量及其类型的结果。它们看起来完全一致:

2019-04-11T06:00:00     string
2019-04-11T06:00:00     string
2019-04-11T14:00:00     string
2019-04-11T14:00:00     string
2019/04/11 12:48:17 Unable to create event. googleapi: Error 400: Invalid value for: Invalid format: "2019-04-11T14:00:00", invalid
exit status 1

我使用的部分Go代码如下:

event := &calendar.Event{
    Summary:     data.schShift + " - Test Event",
    Location:    "Canada",
    Description: "Test event added by Go utility",
    Start: &calendar.EventDateTime{

        // This doesn't work
        DateTime: evtStartDate + "T" + evtStartTime,

        // This works (when unREM'd
        // DateTime: "2019-04-11T06:00:00",
        TimeZone: "America/Toronto",
    },
    End: &calendar.EventDateTime{

        // This doesn't work
        DateTime: evtEndDate + "T" + evtEndTime,

        // This works (when unREM'd
        // DateTime: "2019-04-11T14:00:00",
        TimeZone: "America/Toronto",
    },
}
evtStartDate = evtStartDate + "T" + evtStartTime
fmt.Printf("%v\t%T\n", evtStartDate, evtStartDate)
fmt.Printf("%v\t%T\n", event.Start.DateTime, event.Start.DateTime)
evtEndDate = evtEndDate + "T" + evtEndTime
fmt.Printf("%v\t%T\n", evtEndDate, evtEndDate)
fmt.Printf("%v\t%T\n", event.End.DateTime, event.End.DateTime)

我原本期望变量能被接受,因为它们看起来是相同的类型,但事实并非如此。


更多关于Golang中这两个字符串有什么区别?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢BB-8。文本字符串运行良好,我认为这实际上是一个变量作用域的问题。我在结构体外部进行了设置,一切运行顺利。

更多关于Golang中这两个字符串有什么区别?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


通过查看提供的代码,我认为这可能不是类型问题,而是日期字符串的语法问题。我建议使用 time 包来生成日期字符串。

以下是一个示例:https://goplay.space/#CUxXvptQ6fD

作为参考,这里是 time 包的文档: https://golang.org/pkg/time/

希望这对您有所帮助。

问题在于字符串拼接可能引入了不可见的字符或格式问题。虽然打印出来的字符串看起来相同,但实际内容可能存在差异。以下是几种可能的解决方案:

// 方案1:使用strings.TrimSpace去除可能的空白字符
import "strings"

event := &calendar.Event{
    Start: &calendar.EventDateTime{
        DateTime: strings.TrimSpace(evtStartDate) + "T" + strings.TrimSpace(evtStartTime),
        TimeZone: "America/Toronto",
    },
    End: &calendar.EventDateTime{
        DateTime: strings.TrimSpace(evtEndDate) + "T" + strings.TrimSpace(evtEndTime),
        TimeZone: "America/Toronto",
    },
}

// 方案2:使用fmt.Sprintf确保格式一致
event := &calendar.Event{
    Start: &calendar.EventDateTime{
        DateTime: fmt.Sprintf("%sT%s", evtStartDate, evtStartTime),
        TimeZone: "America/Toronto",
    },
    End: &calendar.EventDateTime{
        DateTime: fmt.Sprintf("%sT%s", evtEndDate, evtEndTime),
        TimeZone: "America/Toronto",
    },
}

// 方案3:检查原始变量的内容
fmt.Printf("evtStartDate: '%s'\n", evtStartDate)
fmt.Printf("evtStartTime: '%s'\n", evtStartTime)
fmt.Printf("evtEndDate: '%s'\n", evtEndDate)
fmt.Printf("evtEndTime: '%s'\n", evtEndTime)

// 方案4:使用bytes.Buffer构建字符串
import "bytes"

var buf bytes.Buffer
buf.WriteString(evtStartDate)
buf.WriteString("T")
buf.WriteString(evtStartTime)
startDateTime := buf.String()

buf.Reset()
buf.WriteString(evtEndDate)
buf.WriteString("T")
buf.WriteString(evtEndTime)
endDateTime := buf.String()

event := &calendar.Event{
    Start: &calendar.EventDateTime{
        DateTime: startDateTime,
        TimeZone: "America/Toronto",
    },
    End: &calendar.EventDateTime{
        DateTime: endDateTime,
        TimeZone: "America/Toronto",
    },
}

建议先使用方案3检查原始变量是否包含不可见字符,然后尝试使用方案1或方案2来构建日期时间字符串。

回到顶部