亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編寫一個方法來反轉任何切片?

如何編寫一個方法來反轉任何切片?

Go
侃侃爾雅 2023-06-26 16:52:12
編寫對“通用”數組進行操作的方法的慣用方法是什么?我有一個類型數組:a := make([]int, 0)我想編寫一個可以對任何類型的數組進行操作的簡單方法:func reverse(a []interface{}) []interface{} {    for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {        a[i], a[j] = a[j], a[i]    }    return a}使用這種方法a = reverse(a)給我帶來了兩個錯誤:cannot use a (type []int) as type []interface {} in argument to reversecannot use reverse(a) (type []interface {}) as type []int in assignment
查看完整描述

3 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

并不是說你現在就可以在生產中使用泛型(截至 2020 年 10 月 2 日),但是對于對即將推出的 go 泛型功能感興趣的人,使用最新的go設計草案,你可以編寫一個泛型函數,reverse如下所示

package main


import (

? ? "fmt"

)


func reverse[T any](s []T) []T {

? ? for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {

? ? ? ? s[i], s[j] = s[j], s[i]

? ? }

? ? return s

}


func main() {

? ? s := []int{1, 2, 3, 4, 5}

? ? s = reverse(s)

? ? fmt.Println(s)

}

輸出:


[5 4 3 2 1]


查看完整回答
反對 回復 2023-06-26
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

在泛型出現(很可能被稱為契約)之前,反射和接口是實現這種泛化的唯一工具。

您可以定義reverse()取值interface{}并使用reflect包對其進行索引并交換元素。這通常很慢,并且難以閱讀/維護。

接口提供了一種更好的方法,但要求您為不同類型編寫方法??匆幌逻@個sort包,特別是sort.Sort()函數:

func?Sort(data?Interface)

哪里sort.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)

}

sort.Sort()能夠對實現 的任何切片進行排序sort.Interface,任何具有排序算法完成其工作所需的方法的切片。這種方法的好處是,您也可以對其他數據結構進行排序,而不僅僅是切片(例如鏈接列表或數組),但通常使用切片。


查看完整回答
反對 回復 2023-06-26
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

耐心!根據向該語言添加類型參數的最新提案草案,您將能夠reverse在 Go 的未來版本中編寫這樣的通用函數:


func reverse[T any](s []T) []T {

    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {

        s[i], s[j] = s[j], s[i]

    }

    return s

}


func main() {

    s := []int{1, 2, 3, 4, 5}

    s = reverse(s)

    fmt.Println(s)

}

游樂場


出于性能原因,您可能希望就地反轉切片:


package main


import "fmt"


func reverse[T any](s []T) {

    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {

        s[i], s[j] = s[j], s[i]

    }

}


func main() {

    s := []int{1, 2, 3, 4, 5}

    reverse(s)

    fmt.Println(s)

}

游樂場



查看完整回答
反對 回復 2023-06-26
  • 3 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號