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
感谢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来构建日期时间字符串。

