Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mencetak senarai 2 di Golang?

Bagaimana untuk mencetak senarai 2 di Golang?

WBOY
WBOYke hadapan
2024-02-11 14:51:08965semak imbas

如何在 Golang 中打印 2 列表?

editor php Baicao akan menunjukkan kepada anda cara mencetak 2 senarai di Golang. Di Golang, kita boleh menggunakan fungsi Println dalam pakej fmt untuk mencetak senarai. Mula-mula, kita perlu menentukan dan memulakan dua senarai secara berasingan, dan kemudian gunakan fungsi Println untuk mencetaknya. Dengan menggunakan gelung dan pembolehubah indeks, kita boleh melelakan elemen senarai satu demi satu dan mencetaknya. Dengan cara ini, kita boleh mencetak kandungan 2 senarai di Golang dengan mudah.

Isi soalan

Saya agak risau dengan masalah ini. Idea saya adalah untuk mempunyai fungsi yang mencetak dua lajur. Yang pertama adalah untuk kunci, yang mempunyai lebar tetap. Yang kedua ialah nilai, yang mungkin merupakan rentetan yang sangat panjang yang lebarnya bergantung pada lebar semasa terminal.

Contoh yang saya mahukan:

key1                                  value1value1value1value1
key2                                  value2value2value2value2value2value2value2value2value2value2value2
                                      value2value2value2value2value2value2value2value2value2value2value2
                                      value2value2value2value2value2value2

Hasil terbaik yang saya perolehi setakat ini ialah menggunakan lipgloss untuk menetapkan lebar tetap untuk lajur pertama.

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)
    }
}

Hasilnya serupa dengan:

Key1                                  Value1Value1Value1Value1
Key2                                  Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2
Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2Value2

Jadi, bagaimanakah cara saya memformat rentetan mengikut kehendak saya? Saya boleh menggunakan kedua-dua perpustakaan standard dan perpustakaan luaran, jadi sebarang cadangan adalah dialu-alukan.

Penyelesaian

Saya mencipta fungsi untuk ini. Fungsi ini mengambil dua parameter, yang pertama ialah pembolehubah pemetaan untuk lajur, dan yang kedua ialah berapa banyak aksara untuk mengisi setiap baris. Ia hanya menukar kandungan nilai kunci dengan ruang menjadi pembolehubah baharu dan kemudian mencetak nilai kunci. Tetapi jika anda mempunyai kerja dengan nilai yang tidak diubah suai, anda boleh menggunakan pembolehubah yang tidak diubah suai.

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
}

Berikut ialah output sampel:

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

Tetapi sila ambil perhatian ini, susunan kunci dan nilai mungkin berbeza pada setiap pelaksanaan kerana jenis peta tidak tertib apabila mencetak dalam gelung for dengan kunci, pasangan nilai.

Atas ialah kandungan terperinci Bagaimana untuk mencetak senarai 2 di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam