Heim  >  Artikel  >  Backend-Entwicklung  >  Wie drucke ich eine 2er-Liste in Golang?

Wie drucke ich eine 2er-Liste in Golang?

WBOY
WBOYnach vorne
2024-02-11 14:51:08962Durchsuche

如何在 Golang 中打印 2 列表?

php-Editor Baicao zeigt Ihnen, wie Sie 2 Listen in Golang drucken. In Golang können wir die Println-Funktion im fmt-Paket verwenden, um die Liste zu drucken. Zuerst müssen wir die beiden Listen separat definieren und initialisieren und sie dann mit der Funktion Println ausdrucken. Mithilfe einer Schleife und einer Indexvariablen können wir die Elemente der Liste einzeln durchlaufen und ausdrucken. Auf diese Weise können wir den Inhalt von 2 Listen in Golang problemlos ausdrucken.

Frageninhalt

Dieses Problem macht mir etwas Sorgen. Meine Idee ist, eine Funktion zu haben, die zwei Spalten druckt. Die erste ist für Tasten, die eine feste Breite haben. Der zweite ist der Wert, der eine sehr lange Zeichenfolge sein kann, deren Breite von der aktuellen Breite des Terminals abhängt.

Ein Beispiel für das, was ich will:

key1                                  value1value1value1value1
key2                                  value2value2value2value2value2value2value2value2value2value2value2
                                      value2value2value2value2value2value2value2value2value2value2value2
                                      value2value2value2value2value2value2

Das beste Ergebnis, das ich bisher erzielt habe, ist die Verwendung von Lipgloss, um eine feste Breite für die erste Spalte festzulegen.

func printmetadata(metadata map[string]string, color string) {
    style := lipgloss.newstyle().width(32).foreground(lipgloss.color(color))
    for k, v := range metadata {
        fmt.println(style.render(k) + v)
    }
}

Das Ergebnis ist ähnlich wie:

Key1                                  Value1Value1Value1Value1
Key2                                  Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2
Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2

Wie formatiere ich also eine Zeichenfolge nach meinen Wünschen? Ich kann sowohl die Standardbibliothek als auch externe Bibliotheken verwenden, daher sind alle Vorschläge willkommen.

Workaround

Ich habe hierfür eine Funktion erstellt. Diese Funktion benötigt zwei Parameter: Der erste ist eine Zuordnungsvariable für die Spalte und der zweite gibt an, mit wie vielen Zeichen jede Zeile gefüllt werden soll. Es ändert lediglich den Wertinhalt des Schlüssels mit Leerzeichen in eine neue Variable und gibt dann den Schlüsselwert aus. Wenn Sie jedoch mit unveränderten Werten arbeiten, können Sie auch unveränderte Variablen verwenden.

package main

import (
    "fmt"
    "errors"
    "strings"
    "sort"
)

func main() {
    a := map[string]string{
    "key1": strings.repeat("value1", 50), 
    "key2": strings.repeat("value2", 50), 
    "key3": strings.repeat("value3", 50),
    }
    
    err := columner(a, 30)
    
    if err != nil {
        fmt.println(err)
    }
    
}

func columner(m map[string]string, charamount int) error{

    var keys []string
    
    var keylens []int
    
    // to avoid index panics and gathering keys for later usage
    for key, value := range m {
        if charamount > len(value) || charamount < 1{
            return errors.new("error: charamount neither be greather than length of key's value nor below 1")
        }
        keys = append(keys, key)
        keylens = append(keylens, len(key))
    }

    sort.ints(keylens)
    
    for i := 0; i < len(keys); i++ {
        
        // for storing updated value of key
        var value2 string
        
        value := m[keys[i]]
        // will used while extracting substring of key's value as first index
        firsti := 0
        
        // last index for extract substring from key's value. the len of substring will be same as charamount
        charamount2 := charamount
        
        // will be used to advance next substring of key's value
        advance := charamount2
        
        // spaces between between key and value 
        // key       value
        spacing := strings.repeat(" ", 20 + (keylens[0] - len(keys[i])))
        
        // var for adjusting spaces of gap between key and value of next line
        // key        value
        //          value
        // to
        // key        value
        //            value
        spacingu := spacing + strings.repeat(" ", len(keys[i]) + 1)
        
        // this loop will be run as long as there is no substring left which exceed next line
        for j := 0; j < len(value); j += advance {
            
            // adjusting spaces of gap between key and value of next line
            if j > 0 {
                spacing = spacingu
            }
            
            // add space between key and value, then extract substring, then add spaces to the next line of the
            // next substring of key's value
            value2 += spacing + value[firsti:charamount2] + "\n"
            
            // finish loop when there is no substring that can be exceed to next line
            if ((len(value) - charamount2) < advance) || ((len(value) - charamount2) == advance) {
                break
            }
    
            // changing first index to start index of next substring of key's value
            firsti = charamount2
            
            // advancing to next substring of key's value
            charamount2 += advance
        }   
        
        // add last remaining substring of key's value to variable which will be show as formatted.
        value2 += spacing + value[charamount2:]

        // show formatted key and value
        fmt.println(keys[i], value2, "\n")
        
    }
    
    return nil
}

Hier ist eine Beispielausgabe:

Key1                     Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1
                         Value1Value1Value1Value1Value1 

Key2                     Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2
                         Value2Value2Value2Value2Value2 

Key3                     Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3
                         Value3Value3Value3Value3Value3

Bitte beachten Sie jedoch, dass die Reihenfolge der Schlüssel und Werte bei jeder Ausführung unterschiedlich sein kann, da Kartentypen beim Drucken in einer for-Schleife mit Schlüssel-Wert-Paaren ungeordnet sind.

Das obige ist der detaillierte Inhalt vonWie drucke ich eine 2er-Liste in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen