在golang中,从地图获取一部分值是否有很好的方法?
如果我有一张地图,那么有一个更好的方法来得到一个值的切片
package main import ( "fmt" ) func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = "c" m[4] = "d" // Can this be done better? v := make([]string, len(m), len(m)) idx := 0 for _, value := range m { v[idx] = value idx++ } fmt.Println(v) }
有一个地图的内置function吗? Go包里有一个函数吗?或者这是我必须做的最好的代码?
很不幸的是,不行。 没有内在的方法来做到这一点。
作为一个方面说明,您可以省略切片创build中的容量参数:
v := make([]string, len(m))
容量暗示与这里的长度相同。
作为jimt职位的补充:
您也可以使用append
而不是明确地将值分配给它们的索引:
m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = "c" m[4] = "d" v := make([]string, 0, len(m)) for _, value := range m { v = append(v, value) }
请注意,长度为零(不存在任何元素),但容量(分配空间)用m
的元素数初始化。 这样做是为了使每次切片v
的容量耗尽时, append
不需要分配内存。
你也可以make
没有容量值的切片,让append
为自己分配内存。
据我目前所知,去没有一个方法来串联string/字节的结果string,而不至less/两/副本。
由于所有的string值都是const,所以你现在必须增长一个[]字节,那么你必须使用stringbuiltin来让语言创build一个'祝福'的string对象,它将复制缓冲区,因为某个地方可能有一个引用到支持[]字节的地址。
如果一个[]字节是合适的,那么你可以在字节上获得一个非常小的优势。通过进行一次分配和执行副本来调用你自己的join函数。
package main import ( "fmt" ) func main() { m := make(map[int]string) m[1] = "a" ; m[2] = "b" ; m[3] = "c" ; m[4] = "d" ip := 0 /* If the elements of m are not all of fixed length you must use a method like this; * in that case also consider: * bytes.Join() and/or * strings.Join() * They are likely preferable for maintainability over small performance change. for _, v := range m { ip += len(v) } */ ip = len(m) * 1 // length of elements in m r := make([]byte, ip, ip) ip = 0 for _, v := range m { ip += copy(r[ip:], v) } // r (return value) is currently a []byte, it mostly differs from 'string' // in that it can be grown and has a different default fmt method. fmt.Printf("%s\n", r) }