Jika saya memiliki peta m, apakah ada cara yang lebih baik untuk mendapatkan potongan nilai v lalu
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)
}
Apakah ada fitur bawaan dari sebuah peta? Apakah ada fungsi dalam paket Go, atau apakah ini kode terbaik yang harus dilakukan jika perlu?
_
denganidx
dan gunakanidx-1
saat menetapkan nilai potongan.Jawaban:
Sayangnya tidak ada. Tidak ada cara bawaan untuk melakukan ini.
Sebagai catatan tambahan, Anda dapat menghilangkan argumen kapasitas dalam pembuatan slice Anda:
v := make([]string, len(m))
Kapasitas diimplikasikan sama dengan panjang disini.
sumber
Sebagai tambahan untuk postingan jimt:
Anda juga dapat menggunakan
append
daripada secara eksplisit menetapkan nilai ke indeksnya: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) }
Perhatikan bahwa panjangnya adalah nol (belum ada elemen yang ada) tetapi kapasitas (ruang yang dialokasikan) diinisialisasi dengan jumlah elemen
m
. Ini dilakukan agarappend
tidak perlu mengalokasikan memori setiap kali kapasitas slicev
habis.Anda juga dapat
make
memotong tanpa nilai kapasitas dan membiarkanappend
mengalokasikan memori untuk dirinya sendiri.sumber
make([]appsv1.Deployment, len(d))
akan menambahkan sekelompok elemen kosong yang dibuat saat Anda mengalokasikanlen(d)
item kosong.Belum tentu lebih baik, tetapi cara bersih untuk melakukan ini adalah dengan mendefinisikan kedua PANJANG Slice and KAPASITAS seperti
txs := make([]Tx, 0, len(txMap))
// Defines the Slice capacity to match the Map elements count txs := make([]Tx, 0, len(txMap)) for _, tx := range txMap { txs = append(txs, tx) }
Contoh lengkap:
package main import ( "github.com/davecgh/go-spew/spew" ) type Tx struct { from string to string value uint64 } func main() { // Extra touch pre-defining the Map length to avoid reallocation txMap := make(map[string]Tx, 3) txMap["tx1"] = Tx{"andrej", "babayaga", 10} txMap["tx2"] = Tx{"andrej", "babayaga", 20} txMap["tx3"] = Tx{"andrej", "babayaga", 30} txSlice := getTXsAsSlice(txMap) spew.Dump(txSlice) } func getTXsAsSlice(txMap map[string]Tx) []Tx { // Defines the Slice capacity to match the Map elements count txs := make([]Tx, 0, len(txMap)) for _, tx := range txMap { txs = append(txs, tx) } return txs }
Solusi sederhana tapi banyak gotcha. Baca posting blog ini untuk lebih jelasnya: https://web3.coach/golang-how-to-convert-map-to-slice-three-gotchas
sumber
Sejauh yang saya ketahui, go tidak memiliki metode cara untuk menggabungkan string / byte ke string yang dihasilkan tanpa membuat setidaknya / dua / salinan.
Saat ini Anda harus menumbuhkan [] byte karena semua nilai string adalah const, MAKA Anda harus menggunakan string bawaan agar bahasa membuat objek string 'diberkati', yang akan menyalin buffer karena sesuatu di suatu tempat dapat memiliki referensi ke alamat yang mendukung [] byte.
Jika sebuah [] byte cocok maka Anda bisa mendapatkan sedikit petunjuk atas fungsi bytes.Join dengan membuat satu alokasi dan melakukan copy memanggil diri Anda sendiri.
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) }
sumber
Anda dapat menggunakan
maps
paket ini :go get https://github.com/drgrib/maps
Maka yang harus Anda hubungi adalah
Ini jenis-aman untuk
map
kombinasi umum itu . Anda dapatgenerate
fungsi aman jenis lain untuk jenis lain yangmap
menggunakanmapper
alat dalam paket yang sama.Pengungkapan penuh: Saya pencipta paket ini. Saya membuatnya karena saya mendapati diri saya menulis ulang fungsi ini
map
berulang kali.sumber