我正在开发一个小型Go程序,它通过UDP接收ascii消息。我想在消息中查找第一个字段,看它是否存在于地图中。 Go认为密钥在地图中不存在,但确实如此。我可以将密钥添加到地图中,并创建一个新条目,因此我有两个具有相同密钥的条目。我是在做错事还是这个错误?
编辑: 我已经简化了测试以删除UDP和YAML。
https://play.golang.org/p/2Bg8UjhfWC
package main
import (
"fmt"
"strings"
)
type TestCase struct {
Test string
Result string
}
func main() {
tcmap := make(map[string]TestCase)
tcmap["adc"] = TestCase{Test: "/bar"}
fmt.Printf("TestMap: ----------\n%v\n\n", tcmap)
buf := make([]byte, 1024)
buf[0] = 'a'//0x61
buf[1] = 'd'//0x64
buf[2] = 'c'//0x63
fmt.Printf("Received: ---------\n%v\n\n", string(buf[0:3]))
fmt.Printf("Compare hex:-------\n|%x| |%x|\n\n", buf[0:3], "adc")
// Get the first field from the message
testname := strings.Split(strings.Trim(string(buf), " "), " ")[0]
fmt.Printf("Test Name: |%v|\n", testname)
// Does the key exist in the map?
if t, ok := tcmap[testname]; ok {
fmt.Printf("Test found: %v\n", t)
} else {
fmt.Printf("Test NOT found\n")
}
// Add testname to map, does it replace existing?
tcmap[testname] = TestCase{Test: "/foo"}
fmt.Printf("\nMAP: ---------\n%v\n\n", tcmap)
fmt.Printf("KEY adc:---------\n%v\n\n", tcmap["adc"])
for k,v := range tcmap {
fmt.Printf("%v: %v\n", k, v)
}
}
输出:
TestMap: ----------
map[adc:{/bar }]
Received: ---------
adc
Compare hex:-------
|616463| |616463|
Test Name: |adc|
Test NOT found
MAP: ---------
map[adc:{/bar } adc:{/foo }]
KEY adc:---------
{/bar }
adc: {/bar }
adc: {/foo }
答案 0 :(得分:2)
正如亚历山大所指出的,问题是两个键之间的长度是不同的。一个密钥的长度为3,另一个密钥的长度为1024.前三个字节相同,而在较长的密钥上,剩余的字节为0x00。
因此两个键的字符串输出使它看起来两个相同,但这让我很愚蠢。钥匙的长度不同。
答案 1 :(得分:1)
其中一个键有一个尾随换行符。如果您使用strings.Trim
而不是 <?php
require_once 'classes/Crud.php';
//function isAjax() To test whether the query is in Ajax
public function isAjax()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']== 'XMLHttpRequest';
}
if(isAjax()){
$banco = new Usuarios();
$idLivro = $_GET['idLivro'];
if($banco->updateBadge($idLivro)){
echo "updated";
}
}
,则会看到尾随的换行符已被修剪且没有重复。