草庐IT

go - 就地截断 slice

coder 2024-07-12 原文

给定一个 slice (不是指向 slice 的指针!)有没有办法就地截断它?

天真的实现不起作用,因为范围:

package main

import (
    "fmt"
)

func truncate(s []int, to int) []int{
    s = s[:to] # <- has no effect outside this function
    return s
}

func main() {
    s := []int{0, 1, 2, 3, 4}
    s1 := truncate(s, 3)
    fmt.Printf("%v\n", s1)
    fmt.Printf("%v\n", s)
}

打印

[0 1 2]
[0 1 2 3 4] # <- can we get [0 1 2] here?

有没有办法修改现有 slice 的长度或容量,或者它们是不可变的?


预计到达时间:我认为这已经足够明显了,但显然不是:当我询问是否可以就地执行此操作时,我的意思是无需重新分配 s.

最佳答案

This是要走的路:

package main

import "fmt"

func main() {
    s := []int{0, 1, 2, 3, 4}
    s = truncate(s, 3)
    fmt.Println(s) // [0 1 2]
}
func truncate(s []int, to int) []int {
    return s[:to]
}

slice 就像底层数组的窗口。


The other way using pointer to the slice :

package main

import "fmt"

func main() {
    s := []int{0, 1, 2, 3, 4}
    truncate(&s, 3)
    fmt.Println(s) // [0 1 2]
}

func truncate(s *[]int, to int) {
    *s = (*s)[:to]
}

关于go - 就地截断 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484147/

有关go - 就地截断 slice的更多相关文章

  1. Ruby Regex,获取所有可能的匹配项(不截断字符串) - 2

    我遇到了ruby​​正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:#Simpleexample"Hey".scan(/../)=>["He"]#Actualresults#Withoverlappingmatchestheresultshouldbe=>["He"],["ey"]我尝试执行并获得所有结果的正则表达式如下所示:"aaaaaa".scan(/^(..+)\1+$/)#Thislooksformultiplesof(here)"a"biggerthanonethat"fills"theentirestring."aa"*3=>true,"aaa"*2=

  2. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  3. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  4. ruby - 为什么 Array#slice 和 Array#slice!表现不同? - 2

    我不明白为什么在Ruby中,Array#slice和Array#slice!的行为与Array#sort和Array#sort!(一个返回新数组的结果,另一个处理当前对象)。使用sort第一个(没有爆炸),返回当前数组的排序副本,并且sort!对当前数组进行排序。slice,返回指定范围的数组,slice!从当前对象删除指定范围。Array#slice!的行为为何如此,而不是使当前对象成为具有指定范围的数组?例子:a=[0,1,2,3,4,5,6,7,8,9]b=a.slice(2,2)puts"slice:"puts"a="+a.inspectputs"b="+b.inspectb=

  5. ruby - Rubys 的 each_slice 的 Scala 版本? - 2

    Scala有Rubys的版本吗each_slice来自Array类? 最佳答案 Scala2.8有grouped将数据分成大小为n的block(可用于实现each_slice功能):scala>vala=Array(1,2,3,4,5,6)a:Array[Int]=Array(1,2,3,4,5,6)scala>a.grouped(2).foreach(i=>println(i.reduceLeft(_+_)))3711据我所知,在2.7.x中没有任何东西可以开箱即用,但是从take(n)和drop(n)来自RandomAccess

  6. ruby-on-rails - 截断 Markdown ? - 2

    我有一个Rails站点,其中的内容是用markdown编写的。我希望显示每个片段,并带有“阅读更多..”链接。我该怎么做?简单截断原始文本将不起作用,例如..>>"Thisisan[example](http://example.com)"[0..25]=>"Thisisan[example](http:"理想情况下,我想让作者(可选)插入一个标记来指定要用作“片段”的内容,否则需要250个单词,并附加“...”-例如..Thisarticleisanexampleofsomethingorother.Thissegmentwillbeusedasthesnippetontheinde

  7. ruby-on-rails - Rails 上的 ruby : How to have multiple submit buttons going to different methods (maybe with with_action? ) - 2

    这个问题在这里已经有了答案:HowdoIcreatemultiplesubmitbuttonsforthesameforminRails?(7个答案)关闭9年前。所以..'save'%>'library'%>然后在我的Controller中:with_actiondo|a|a.savedoenda.librarydoendend问题是只有一个操作被调用...两个submit_tags调用相同的操作...知道为什么吗?或者我如何获得两个按钮以将表单提交给两种不同的方法?

  8. ruby - Array#slice 的重叠等效项 - 2

    这个问题在这里已经有了答案:Rubyarrayaccess2consecutive(chained)elementsatatime(4个答案)关闭3年前。给定这个Ruby数组:[1,2,3,4,5]像这样迭代它的最简单方法是什么?[[1,2],[2,3],[3,4],[4,5]]还是这个?[[1,2,3],[2,3,4],[3,4,5]]

  9. ruby - 太长时截断字符串 - 2

    我有两个字符串:short_string="helloworld"long_string="thisisaverylonglonglong....string"#supposemorethan10000chars我想将print的默认行为更改为:putsshort_string#=>"helloworld"putslong_string#=>"thisisaverylonglong....."long_string只打印了一部分。我尝试更改String#to_s,但没有成功。有谁知道如何做到这一点?已更新实际上我希望它能顺利运行,这意味着以下情况也能正常运行:>putsvery_lon

  10. ruby-on-rails - 如何不截断 Mongoid 日志? - 2

    这是Mongoid记录操作的方式:D,[2016-01-12T18:42:19.790639#7906]DEBUG--:MONGODB|localhost:27017|app_test.update|STARTED|{"update"=>"users","updates"=>[{"q"=>{"_id"=>BSON::ObjectId('5695652bc54d2d1ee200001e')},"u"=>{"$addToSet"=>{"favorite_ids"=>{"$each"=>[BSON::ObjectId('5695652bc54d2d1ee200001f')]}}},"mult

随机推荐