Golang中如何在条件语句中使用case语句?
Golang中如何在条件语句中使用case语句? 大家好!我正在为停车传感器编写设备驱动程序,该程序检测接收到的有效载荷并告知有效载荷包含的内容。但我在这里遗漏了一些概念,有人能帮我看看缺少什么吗?谢谢。
package main
import (
"fmt"
)
func main(){
var payload = []byte(
"0x01 0x06 0x01 0x3B 0x0A 0x2D 0xFF 0x00",
)
if payload[0] == 1{
fmt.Println(" Parking status message ")
}else if payload[0] == 2 {
fmt.Println(" Heart beat message ")
}else if payload[0] == 3{
fmt.Println(" Start uo message ")
}else {
fmt.Println(" Wrong payload")
}
if payload[1] == 6{
fmt.Println(" Payload length is: ")
fmt.Printf(" %v", payload[1])
} else if payload[1] == 0 {
fmt.Println(" Payload length is: ")
fmt.Printf("%v", payload[1])
} else if payload[1] == 1 {
fmt.Println(" Payload length is: ")
fmt.Printf(" %v", payload[1])
} else {
fmt.Println(" wrong payload")
}
if payload[2] == 0||1{
switch payload{
case 0:
fmt.Println("Free parking space")
case 1:
fmt.Println("Parking space ocuupied")
41 > }else if payload[2] == 1{
fmt.Println(" Parking status message “) }else { fmt.Println(” Wrong payload “) } } if payload[3] == 1{ fmt.Println(“Payload length of Heartbeat Length”) fmt.Printf(”%v", payload[3]) }else { fmt.Println(“Wrong Payload”) } if payload[14:16] == []byte{
54 > fmt.Printf(" The firmware version is: %x")
}
56 > else {
fmt.Println(“wrong payload”) }}
以下是我遇到的错误:
41 > // 语法错误:语句末尾出现意外的 else (构建)
golint
期望 ‘;’,找到 ‘else’(还有3个错误)(golint)
vet
语法错误:语句末尾出现意外的 else (vet)//
54 > // 语法错误:意外的换行符,期望逗号或 } (构建)
vet
语法错误:意外的换行符,期望逗号或 } (vet)//
56 > // 语法错误:意外的 else,期望表达式 (构建)
vet
语法错误:意外的 else,期望表达式 (vet)//
更多关于Golang中如何在条件语句中使用case语句?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
没问题,谢谢你的帮助。我该如何说明 payload 是十六进制的?
你分享的错误信息是否包含相关的行号?这样能让我们更容易定位到需要查看的具体语句。
只是在 else 前面少了一个 }。
但可能是其他问题…由于缺少代码注释和开头的 >,你的代码几乎无法阅读。
该设备是博世停车传感器,内置电池和LoRa芯片,一旦触发就会开始发送数据载荷。这不是即插即用设备。
NobbZ:
你的
payload是什么类型?这将有助于回答后续问题…
载荷是十六进制的。传感器通信的所有内容都是十六进制格式,我需要对其进行解码。
我想知道它在你的应用程序中是如何被接收的。其他都不重要。除非你知道你的LoRa检查过的数据包在Go中会是什么样子……
我完全不知道LoRa是什么,所以无法做出任何假设……
设备在LoRa网络服务器中发送的实际载荷将如下所示: “110a000f00551001”
NobbZ:
0x01 0x06 0x01 0x3B 0x0A 0x2D 0xFF 0x00
传感器数据手册中给出的格式如上所示。
hemanth_naidu:
- 每次我从十六进制载荷中访问一个字节时,它是否会考虑两个字符如’0A’,因为它包含1个字节?
你的 payload 是什么类型?这将有助于回答后续问题…
你能否提供一个 fmt.Printf("%#v", payload) 的示例输出?
fmt.Printf("%#v", payload)
前两个字节是 0x 的 ASCII 码,你确定这是从网络接收到的数据,而不仅仅是你硬编码的示例吗?
另外,每第五个字节是 32,也就是空格……我怀疑这不是有效载荷,因为任何嵌入式设备或传感器都不会无缘无故地通过网络发送它,这会增加设备的功耗……
// 代码部分保持原样
感谢您的解释。(2个字节是0x的ASCII码,第五个字节是32,表示空格)
您说得对,目前我给出的是硬编码的示例负载。当我为硬编码负载编写好可运行的代码后,我打算实现下一部分。
然而,当传感器连接到LoRaWAN网络时,发送的负载仍然是"110a000f00551001",没有空格和’0x01’。
NobbZ:
我也不知道lora是什么,所以无法做出任何假设
我所说的lora是指LoRaWAN,这是LoRaWAN®规范说明 - LoRa Alliance®。
hemanth_naidu:
“110a000f00551001”
在我的应用程序中它会显示成这样,并且是以十六进制格式接收的。
fmt.Printf("%v", payload)
[48 120 48 49 32 48 120 48 54 32 48 120 48 49 32 48 120 51 66 32 48 120 48 65 32 48 120 50 68 32 48 120 70 70 32 48 120 48 48]错误的载荷 错误的载荷 错误的载荷
hemanth_naidu:
每次我从十六进制载荷中访问一个字节时,它是否会考虑两个字符如’0A’,因为它由1个字节组成。
我认为你需要以某种方式转换它,但由于我还没有处理过这样的十六进制数据,我不确定最佳方法是什么。
hemanth_naidu:
即使载荷正确,代码也只打印错误的载荷语句。
是的,因为你在检查payload[2]是否为int类型,而不是你期望的字节。(据我所知…)
很抱歉没能提供更多帮助。
我花了几分钟在Go Playground上运行了这段代码。它运行没有错误。请注意我注释掉了以下部分,因为我不确定您在那里想要实现什么:
if payload[14:16] == []byte {
fmt.Println("The firmware version is:")
} else {
fmt.Println("wrong payload")
}
这是Go Playground上格式化后代码的链接:https://play.golang.org/p/cawRiZLL89f
正如有人提到的,这里发布的代码真的很难阅读,大大降低了别人能够帮助的机会。我只是碰巧在工作中有个小休息时间,想玩玩您的代码。您的帖子越清晰越好。
我下次发帖时会取消缩进。我有几个问题:
- 每次我从十六进制载荷中访问一个字节时,它是否会考虑两个字符如’0A’,因为它包含1个字节。
- 例如,当我说’payload[2] == 6’时,这里的6是十进制,而payload[2]是十六进制。我应该在此之前将载荷转换为十进制吗?还是不需要。
- 数组索引是从最高有效位开始还是从最低有效位开始
对于你评论的部分。传感器发送了三种不同的载荷。在第三种载荷中没有条件,我只想打印载荷的值或它包含的消息(如固件版本1.0.1)。 即使载荷是正确的,代码也只打印错误的载荷语句。载荷以一个单独的字符串形式出现,例如"2837f889a888c98e89"。我必须解码它。 这是我放置传感器发送的另外两条消息的链接。 https://play.golang.org/p/To6b-_ZA3hJ
@hemanth_naidu @NobbZ 说得对:你用于测试的负载数据是错误的。
如果你获取的负载是十六进制编码的字符串,那么你需要先对其进行解码。我根据你的脚本做了一些修改,但不确定是否能帮到你。
var payloadStr = "110a000f00551001"
payload, err := hex.DecodeString(payloadStr)
if err != nil {
panic(err)
}
fmt.Printf("%#v", payload)
// 比较时使用十六进制格式
if payload[0] == 0x11 {
fmt.Println(" Parking status message ")
} else if payload[0] == 0x02 {
fmt.Println(" Heart beat message ")
} else if payload[0] == 0x03 {
fmt.Println(" Start uo message ")
} else {
fmt.Println("Wrong payload")
}
提示:如果你在处理字节数据,了解 bytes 包会很有帮助:
// bytes 包包含许多有用的函数,可以简化你的工作。
if bytes.Equal(payload[0:2], []byte{0x11, 0xa}) {
fmt.Printf(" The firmware version is: %x")
} else {
fmt.Println("wrong payload")
}
你的代码有几个语法和逻辑错误。我来指出问题并提供修正后的版本:
主要问题:
if payload[2] == 0||1- 这是错误的语法switch payload但后面是case 0:- 应该比较payload[2]- 不匹配的括号和逻辑结构
- 切片比较语法错误
修正后的代码:
package main
import (
"fmt"
)
func main() {
var payload = []byte{0x01, 0x06, 0x01, 0x3B, 0x0A, 0x2D, 0xFF, 0x00}
// 第一个字节的判断
if payload[0] == 1 {
fmt.Println("Parking status message")
} else if payload[0] == 2 {
fmt.Println("Heart beat message")
} else if payload[0] == 3 {
fmt.Println("Start up message")
} else {
fmt.Println("Wrong payload")
}
// 第二个字节的判断
if payload[1] == 6 {
fmt.Println("Payload length is: ")
fmt.Printf("%v\n", payload[1])
} else if payload[1] == 0 {
fmt.Println("Payload length is: ")
fmt.Printf("%v\n", payload[1])
} else if payload[1] == 1 {
fmt.Println("Payload length is: ")
fmt.Printf("%v\n", payload[1])
} else {
fmt.Println("wrong payload")
}
// 第三个字节使用switch case
switch payload[2] {
case 0:
fmt.Println("Free parking space")
case 1:
fmt.Println("Parking space occupied")
default:
fmt.Println("Wrong payload")
}
// 第四个字节的判断
if payload[3] == 1 {
fmt.Println("Payload length of Heartbeat Length")
fmt.Printf("%v\n", payload[3])
} else {
fmt.Println("Wrong Payload")
}
// 切片比较的正确方式
if len(payload) >= 16 {
firmwareVersion := payload[14:16]
fmt.Printf("The firmware version is: %x\n", firmwareVersion)
} else {
fmt.Println("wrong payload - insufficient length")
}
}
关键修正点:
- 正确的switch case用法:
switch payload[2] {
case 0:
fmt.Println("Free parking space")
case 1:
fmt.Println("Parking space occupied")
default:
fmt.Println("Wrong payload")
}
- 正确的切片比较:
if len(payload) >= 16 {
firmwareVersion := payload[14:16]
fmt.Printf("The firmware version is: %x\n", firmwareVersion)
}
- 正确的字节数组初始化:
var payload = []byte{0x01, 0x06, 0x01, 0x3B, 0x0A, 0x2D, 0xFF, 0x00}
这样修正后,代码应该能够正常编译运行,并且正确地处理停车传感器的有效载荷解析。


