當嘗試在 go 中附加迭代的值時,該函式將最后一次迭代附加 4 次。例如,我正在嘗試將包含網卡資料的字串決議為地圖,并且在迭代時只附加最后一個:
這是帶有代碼的游樂場鏈接: https ://go.dev/play/p/mKtFvK36PMn
package main
import (
"fmt"
"strings"
)
type Foo struct {
val int
}
func main() {
NetworkJson := "4 NIC(s) Installed.,[01]: Realtek PCIe GbE Family Controller, Connection Name: Ethernet, DHCP Enabled: Yes, DHCP Server: 10.101.10.13, IP address(es), [01]: 10.1.2.62,[02]: VirtualBox Host-Only Ethernet Adapter, Connection Name: VirtualBox Host-Only Network, DHCP Enabled: No, IP address(es), [01]: 192.168.56.1, [02]: fe80::4c17:978a:2c91:8e27,[03]: VMware Virtual Ethernet Adapter for VMnet1, Connection Name: VMware Network Adapter VMnet1, DHCP Enabled: Yes, DHCP Server: 192.168.146.254, IP address(es), [01]: 192.168.146.1, [02]: fe80::88b4:d443:2ab8:59b5,[04]: VMware Virtual Ethernet Adapter for VMnet8, Connection Name: VMware Network Adapter VMnet8, DHCP Enabled: Yes, DHCP Server: 192.168.128.254, IP address(es), [01]: 192.168.128.1, [02]: fe80::a40d:e64:fa9f:e82f"
var IPs []string
var Data []string
var IPMap = make(map[string]string)
var CardMap = make(map[string]interface{})
var CardIP = make(map[string][]map[string]string)
var NetCard = make(map[string][]interface{})
// Faz loop entre as placas de rede
for _, Cards := range strings.Split(string(NetworkJson), ",[") {
// Faz loop entre os dados de cada placa
for _, CardData := range strings.Split(string(Cards), ",") {
// Verifica se dado inicia com espa?o em branco
if strings.HasPrefix(CardData, " ") {
// Verifica se dado sem o espa?o em branco come?a com [
if strings.HasPrefix(strings.TrimSpace(CardData), "[") {
// Pega IPS
IPs = strings.Split(strings.TrimSpace(string(CardData)), ": ")
IPMap[string(IPs[0])] = strings.TrimSpace(string(IPs[1]))
// Se n?o iniciar com [ verifica se contém :
} else if strings.Contains(CardData, ":") {
// Pega restante dos dados
Data = strings.Split(strings.TrimSpace(string(CardData)), ":")
CardMap[Data[0]] = strings.TrimSpace(Data[1])
}
}
}
if strings.Contains(Cards, "]") {
// Aloca dados
CardMap["Card Name"] = string(strings.SplitN(string(Cards), ",", 2)[0])[5:]
CardIP["IP Adress(es)"] = append(CardIP["IP Adress(es)"], IPMap)
CardMap["IP Adress(es)"] = CardIP["IP Adress(es)"]
CardIP["IP Adress(es)"] = CardIP["IP Adress(es)"][:0]
NetCard["Cards"] = append(NetCard["Cards"], CardMap)
fmt.Println(CardMap)
}
fmt.Println(NetCard["Cards"])
}
}
uj5u.com熱心網友回復:
您將所有內容存盤到同一個地圖變數 CardMap 中,并且您使用的是單數鍵“卡名”。append(NetCard["Cards"], CardMap)不做 CardMap 的深拷貝,只附加一個淺拷貝,因此每次迭代都會更新淺拷貝的資料。你的其他變數也有同樣的問題。
將變數宣告移到主回圈中:
var NetCard = make(map[string][]interface{})
// Faz loop entre as placas de rede
for _, Cards := range strings.Split(string(NetworkJson), ",[") {
var IPs []string
var Data []string
var IPMap = make(map[string]string)
var CardMap = make(map[string]interface{})
var CardIP = make(map[string][]map[string]string)
// Faz loop entre os dados de cada placa
for _, CardData := range strings.Split(string(Cards), ",") {
// ...
https://go.dev/play/p/VE_VWOsvsna
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442919.html
上一篇:這個嵌套回圈如何得到這個輸出?
