代码之家  ›  专栏  ›  技术社区  ›  Abdul Hameed

奇怪的行为

  •  2
  • Abdul Hameed  · 技术社区  · 6 年前

    我刚开始玩Go-lang,遇到了一个奇怪的行为。我有一个结构 A 还有另一个结构 B ,在结构中 B 一键定义为 []A 问题是在为的新实例类型赋值时 作为 A 尽管类型相同,它仍会抛出错误。任何帮助都将不胜感激 下面我将粘贴导致错误的最小代码

    package main
    
    import (
        "fmt"
        "math"
        "github.com/shirou/gopsutil/disk"
        "strconv"
    )
    
    func main() {
    
        /************ disk details goes here ************/
        diskPartitions, err := disk.Partitions(true)
        dealwithErr(err)
        fmt.Println(diskPartitions)
    
        type PARTITIONLIST []PARTITION
        var partitionsList PARTITIONLIST
    
        for partitionIndex, partition := range diskPartitions {
            partitionStat, err := disk.Usage(partition.Mountpoint)
            dealwithErr(err)
    
            var partitionDetails = PARTITION{
                "PARTITION",
                partitionIndex,
                partition.Mountpoint,
                "" + fmt.Sprint(partitionStat.Total) + " and " + bytesToSize(partitionStat.Total),
                "" + fmt.Sprint(partitionStat.Used) + " and " + bytesToSize(partitionStat.Used),
                "" + fmt.Sprint(partitionStat.Free) + " and " + bytesToSize(partitionStat.Free),
                "" + fmt.Sprint(partitionStat.UsedPercent) + "and " + strconv.FormatFloat(partitionStat.UsedPercent, 'f', 2, 64),
            }
    
            partitionsList = append(partitionsList, partitionDetails)
        }
    
        //till here working fine
        fmt.Println(partitionsList)
    
        //THE BELOW TWO LINES ERROR IS THE ACTUAL ERROR I AM ASKING
        var partitionDetails = PARTITIONS{
            "partitions",
            partitionsList
        }
    
    
    
        dealwithErr(err)
    }
    
    /************ all struct goes here ************/
    
    type PARTITION struct {
        Name                   string
        Partition_index        int
        Partition              string
        Total_space_in_bytes   string
        Used_space_in_bytes    string
        Free_space_in_bytes    string
        Percentage_space_usage string
    }
    
    type PARTITIONLIST []PARTITION
    
    type PARTITIONS struct {
        Name                string
        List                []PARTITIONS
    }
    
    /************ helper functions goes below here ************/
    func bytesToSize(bytes uint64) string {
        sizes := []string{"Bytes", "KB", "MB", "GB", "TB"}
        if bytes == 0 {
            return fmt.Sprint(float64(0), "bytes")
        } else {
            var bytes1 = float64(bytes)
            var i = math.Floor(math.Log(bytes1) / math.Log(1024))
            var count = bytes1 / math.Pow(1024, i)
            var j = int(i)
            var val = fmt.Sprintf("%.1f", count)
            return fmt.Sprint(val, sizes[j])
        }
    }
    
    func dealwithErr(err error) {
        if err != nil {
            fmt.Println(err)
        }
    }
    

    意外换行符,应为逗号或}

    无法将partitionsList(类型partitionsList)用作类型[]分区

    2 回复  |  直到 6 年前
        1
  •  1
  •   Himanshu    6 年前

    正如错误明确指出的:

    无法将partitionsList(类型partitionsList)用作类型[]分区

    结构中存在类型不匹配问题。因为PARTITIONSLIST不等于[]个分区。所以如果你创建两种类型的变量,它们是不同的。

    type PARTITIONLIST []PARTITION
    
    type PARTITIONS struct {
        Name                string
        List                []PARTITIONS // here the list is slice of Partitions.
    }
    

    在创建分区列表类型的切片时。

    var partitionsList PARTITIONLIST // this is a variable of PARTITIONLIST type which is not equal to `[]PARTITIONS`
    

    package main
    
    import "fmt"
    
    type MyInt int
    
    func main() {
        var a int = 2
        var b MyInt = 2
        fmt.Println(a==b)
    }
    

    输出:

    无效操作:a==b(int和MyInt类型不匹配)

    Playground Example

    []PARTITIONS 作为:

    var partitionsList `[]PARTITIONS`
    

    或者您可以创建 PARTITIONLIST 键入使其相似。

    意外换行符,应为逗号或}

    是因为你需要通过考试 , 在最后一个字段之后,如果您在新行中将其用作:

    var partitionDetails = PARTITIONS{
        "partitions",
        partitionsList, // pass comma here in your code.
    }
    

    完整工作示例:

    package main
    
    import (
        "fmt"
        "math"
        "strconv"
    
        "github.com/shirou/gopsutil/disk"
    )
    
    func main() {
    
        /************ disk details goes here ************/
        diskPartitions, err := disk.Partitions(true)
        dealwithErr(err)
        fmt.Println(diskPartitions)
    
        var partitionsList PARTITIONLIST
    
        for partitionIndex, partition := range diskPartitions {
            partitionStat, err := disk.Usage(partition.Mountpoint)
            dealwithErr(err)
    
            var partitionDetails = PARTITION{
                "PARTITION",
                partitionIndex,
                partition.Mountpoint,
                "" + fmt.Sprint(partitionStat.Total) + " and " + bytesToSize(partitionStat.Total),
                "" + fmt.Sprint(partitionStat.Used) + " and " + bytesToSize(partitionStat.Used),
                "" + fmt.Sprint(partitionStat.Free) + " and " + bytesToSize(partitionStat.Free),
                "" + fmt.Sprint(partitionStat.UsedPercent) + "and " + strconv.FormatFloat(partitionStat.UsedPercent, 'f', 2, 64),
            }
    
            partitionsList = append(partitionsList, partitionDetails)
        }
    
        //till here working fine
        fmt.Println(partitionsList)
    
        //THE BELOW TWO LINES ERROR IS THE ACTUAL ERROR I AM ASKING
        var partitionDetails = PARTITIONS{
            "partitions",
            partitionsList,
        }
    
        fmt.Println(partitionDetails)
    
        dealwithErr(err)
    }
    
    /************ all struct goes here ************/
    
    type PARTITION struct {
        Name                   string
        Partition_index        int
        Partition              string
        Total_space_in_bytes   string
        Used_space_in_bytes    string
        Free_space_in_bytes    string
        Percentage_space_usage string
    }
    
    type PARTITIONLIST []PARTITION
    
    type PARTITIONS struct {
        Name string
        List PARTITIONLIST
    }
    
    /************ helper functions goes below here ************/
    func bytesToSize(bytes uint64) string {
        sizes := []string{"Bytes", "KB", "MB", "GB", "TB"}
        if bytes == 0 {
            return fmt.Sprint(float64(0), "bytes")
        } else {
            var bytes1 = float64(bytes)
            var i = math.Floor(math.Log(bytes1) / math.Log(1024))
            var count = bytes1 / math.Pow(1024, i)
            var j = int(i)
            var val = fmt.Sprintf("%.1f", count)
            return fmt.Sprint(val, sizes[j])
        }
    }
    
    func dealwithErr(err error) {
        if err != nil {
            fmt.Println(err)
        }
    }
    

    Playground example

        2
  •  1
  •   nilsocket    6 年前

    this 改变你的命名方式,

    花点时间决定什么是专有名称。

    PARITIONLIST

    type PARTITIONLIST []PARTITION //17th line, remove this
    

    PARTITIONS 定义为,

    type PARTITIONS struct {
        Name string
        List []PARTITION
    }
    

    你可以用 PARTITIONLIST 而不是 []PARTITION List

    var partitionDetails = PARTITIONS{
            "partitions",
            partitionsList,
        }