string - Unexpected value when getting value from a map -
so have struct this:
type magni struct { ... handlers map[string]func(*message) ... }
and have function create new instance of struct:
func new(nick, user, real string) *magni { return &magni{ ... handlers: make(map[string]func(*message)), ... } }
but can't handlers
map key "hey"
when "hey"
in variable, works if type myself. here method of struct magni
, m
pointer struct magni
:
handler := m.handlers[cmd[3][1:]] // cmd[3][1:] contains string "hey" handler2 := m.handlers["hey"]
for reason, value of handler
nil
, value of handler2
0x401310
, not expecting handler
nil
.
am doing wrong or expected behavior?
getting value based on value of variable works:
m := map[string]string{"hey": "found"} fmt.println(m["hey"]) // found cmd := []string{"1", "2", "3", "hey"} fmt.println(m[cmd[3]]) // found
it works if variable of string
type , slice value, e.g.:
cmd = []string{"1", "2", "3", "hhey"} fmt.println(m[cmd[3][1:]]) // found
you issue cmd[3]
string
"hey"
itself, if slice cmd[3][1:]
, cut off first character (or precise: first byte utf-8 encoding sequence, memory representation of string
s, characters of "hey"
map bytes one-to-one), "ey"
, not find associated value in map of course:
cmd = []string{"1", "2", "3", "hey"} fmt.println(m[cmd[3][1:]]) // not found (empty string - 0 value)
try these on go playground.
if cmd[3]
"hey"
, no need slice it, use key.
edit: claim cmd[3]
contains string
":hey"
. if would, work:
cmd = []string{"1", "2", "3", ":hey"} fmt.println(m[cmd[3][1:]]) // found
so cmd[3]
not think is. may contain 0
bytes or unprintable characters. print bytes verify. example bytes of string
":hey"
are: [58 104 101 121]
fmt.println([]byte(":hey")) // prints [58 104 101 121]
print cmd[3]
verify:
fmt.println([]byte(cmd[3]))
you compare strings
think is, tell whether equal (and won't tell difference is):
fmt.println(cmd[3] == ":hey", cmd[3][1:] == "hey")
Comments
Post a Comment