脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 详解Go语言如何实现字符串切片反转函数

详解Go语言如何实现字符串切片反转函数

2022-11-29 11:16宇宙之一粟 Golang

Go 语言不像其他语言如 Python,有着内置的 reverse() 函数,本文将先学习一下Python中对于列表的反转方法,然后再学习如果在Go语言中实现相同的功能,感兴趣的小伙伴快跟随小编一起来学习一下

Python 中的 reverse 函数

Go 语言不像其他语言如 Python,有着内置的 reverse() 函数,先来看一下 Python 中对于列表的反转方法,然后我们再来学习如果在 Go 语言中实现相同的功能。

?
1
2
3
4
5
>>> myList = [2022, 2021, 2008, 2012]
>>> myList.reverse()
>>> print("Reversed List:", myList)
Reversed List: [2012, 2008, 2021, 2022]
>>>

实现一个 reverse 反转函数

reverse 算法取一个数据集,并将该数据集的值进行反转,Go 标准的 sort 包并没有内置的方法来反转一个切片。

利用两个切片实现

设计思想:

  • 确定切片长度
  • 获取最后一个元素
  • 以相反的顺序在新切片中添加最后一个元素到第一个位置
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
 
import "fmt"
 
func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}
 
    // 定义新的反转切片
    reverseOfS := []string{}
 
    // 遍历原切片 s
    for i := range s {
        reverseOfS = append(reverseOfS, s[len(s)-1-i])
    }
    fmt.Println(reverseOfS)
}

运行结果:

[zzz abc go bar foo hello]

显然,这种方式会额外花费一个相同空间的切片,空间复杂度为 O(n)

前后两两原地交换

我们可以写一个简易的 reverse 函数来进行数据的反转,通过循环原切片的一半,然后依次与对应的元素进行交换,比如::

?
1
2
3
4
5
6
7
func reverse(s []string) []string {
    for i := 0; i < len(s)/2; i++ {
        j := len(s) - i - 1
        s[i], s[j] = s[j], s[i]
    }
    return  s
}

这个函数可以通过更简短的实现,通过 Go 内部的操作进行循环:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
 
import "fmt"
 
func reverse(s []string) []string {
    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 := []string{"hello", "foo", "bar", "go", "abc", "zzz"}
 
    reverseOfS := reverse(s)
 
    fmt.Println(reverseOfS)
}

执行结果:

[zzz abc go bar foo hello]

但是,上面的 reverse 函数都是通过切片按值传递,其实我们在修改传递中的 []string 切片,实际上,可以通过以下方式进一步简写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
 
import "fmt"
 
func reverse(s []string) {
    for i := 0; i < len(s)/2; i++ {
        j := len(s) - i - 1
        s[i], s[j] = s[j], s[i]
    }
}
 
func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}
 
    reverse(s)
    fmt.Printf("%v\n", s)
}

此时,reverse() 函数不会返回切片的另一个引用,此时的交换就是就地进行,此时更像文章开头 Python 中的 reverse() 函数。

反转为原切片的副本

如果我们要返回切片的反转的副本,reverse 函数就可以这样写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import "fmt"
 
func reverse(s []string) []string {
 
    newS := make([]string, len(s))
    for i, j := 0, len(s)-1; i <= j; i, j = i+1, j-1 {
        newS[i], newS[j] = s[j], s[i]
    }
    return newS
}
 
func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}
 
    fmt.Printf("原字符串切片:%v\n", s)
    fmt.Printf("反转后的切片:%v\n", reverse(s))
}

运行结果:

原字符串切片:[hello foo bar go abc zzz]
反转后的切片:[zzz abc go bar foo hello]

可以看到,原切片是没有变化的。

当然,因为我们没有就地修改原切片,因此又可以回到最初的方法 append,看代码:

?
1
2
3
4
5
6
7
8
9
func reverse(s []string) []string {
 
    newS := make([]string, 0, len(s))
 
    for i := len(s)-1; i >= 0; i-- {
        newS = append(newS, s[i])
    }
    return newS
}

运行结果图如下:

详解Go语言如何实现字符串切片反转函数

总结

本文通过 Python 中的 reverse() 函数的一个示例,引发出一个思考:Go 语言中有没有类似的反转函数?

然后通过几种方式实现同样的字符串切片的反转功能,并通过借助额外空间和就地反转两种方式实现了功能相同 reverse 函数,其实类似的反转思想也可以用于字符串或者链表反转等其他数据结构。

到此这篇关于详解Go语言如何实现字符串切片反转函数的文章就介绍到这了,更多相关Go语言字符串切片反转函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7155384011089510407

延伸 · 阅读

精彩推荐
  • Golanggolang RPC包原理和使用详细介绍

    golang RPC包原理和使用详细介绍

    golang的rpc支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC,它和传统的RPC系统不同,它只支持Go开发的服务器与客户端之间的交互,因为在...

    whynogome5052022-11-20
  • Golang解决golang http.FileServer 遇到的坑

    解决golang http.FileServer 遇到的坑

    这篇文章主要介绍了解决golang http.FileServer 遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一名路过的小码农11042021-03-06
  • GolangGo语言调用其它程序并获得程序输出的方法

    Go语言调用其它程序并获得程序输出的方法

    这篇文章主要介绍了Go语言调用其它程序并获得程序输出的方法,实例分析了Go调用cmd程序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    Go语言编程实例3182020-04-18
  • Golang如何使用go-zero开发线上项目

    如何使用go-zero开发线上项目

    这篇文章主要介绍了如何使用go-zero开发线上项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    Kevin Wan13462021-03-05
  • Golang项目实战:使用 Fiber + Gorm 构建 Rest API

    项目实战:使用 Fiber + Gorm 构建 Rest API

    Fiber 作为一个新的 Go 框架,似乎受追捧程度很高,Star 数飙升很快。不知道这是不是表明,不少 JS/Node 爱好者开始尝试学习 Go 了,对 Go 是好事。...

    幽鬼13412022-01-07
  • GolangGo语言字符串常见操作的使用汇总

    Go语言字符串常见操作的使用汇总

    这篇文章主要为大家总结了Go语言中常见的几种字符串操作,例如:位置索引、替换、统计次数等,文中的示例代码讲解详细,感兴趣的可以了解一下...

    隐姓埋名48694542022-09-25
  • GolangGolang实现http重定向https

    Golang实现http重定向https

    这篇文章介绍了Golang实现http重定向https的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    taadis6422022-07-13
  • GolangGolang动态调用方法小结

    Golang动态调用方法小结

    本文主要介绍了Golang动态调用方法小结,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    code3017522022-01-25