Go map有重复的键

时间:2016-12-09 15:53:23

标签: go

我正在开发一个小型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 }

2 个答案:

答案 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"; } } ,则会看到尾随的换行符已被修剪且没有重复。