登录
首页 >  Golang >  Go问答

Sort.Reverse in Go

来源:stackoverflow

时间:2024-03-28 22:42:28 333浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Sort.Reverse in Go》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我正在查看 sort.reverse 代码:

type reverse struct {
    // This embedded Interface permits Reverse to use the methods of
    // another Interface implementation.
    Interface
}

// Less returns the opposite of the embedded implementation's Less method.
func (r reverse) Less(i, j int) bool {
    return r.Interface.Less(j, i)
}

// Reverse returns the reverse order for data.
func Reverse(data Interface) Interface {
    return &reverse{data}
}

据我了解,reverse 实现了 interface (并覆盖 less),而 *reverse 没有实现 interface。为什么 reverse 返回 *reverse (不知为何是 interface)?


解决方案


对于您的评论:

golang 中没有方法重写。它不会覆盖 less。它正在实现 interfaceless,它是 interface 类型:

type interface interface {
        // len is the number of elements in the collection.
        len() int
        // less reports whether the element with
        // index i should sort before the element with index j.
        less(i, j int) bool
        // swap swaps the elements with indexes i and j.
        swap(i, j int)
}

对于所提出的问题:

因为要更改数据的顺序,所以它应该是反向结构的地址。这就是为什么它是 *reverse。现在您可以传递任何实现 interface 接口的类型。为了实现 interface,您应该实现 interface 中定义的所有方法。

type intslice []int

func (p intslice) len() int           { return len(p) }
func (p intslice) less(i, j int) bool { return p[i] < p[j] }
func (p intslice) swap(i, j int)      { p[i], p[j] = p[j], p[i] }

在上面的例子中,您可以看到 intslice 实现了 interface。因此,您可以将 intslice 作为参数传递给 reverse。

作为示例,您还可以使用 float 值来实现:

package main

import (
    "fmt"
    "sort"
)

func main() {
    //s := []int{5, 2, 6, 3, 1, 4} // unsorted
    s1 := []float64{5.2, 2.6, .6, .03, 2.1 } // unsorted
    sort.Sort(sort.Reverse(sort.Float64Slice(s1)))
    fmt.Println(s1)
}

Playground example

今天关于《Sort.Reverse in Go》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>