以下是要复制的代码:
token2
package main
import "fmt"
func main() {
var v []int
v = append(v,1)
v = append(v,v[1:]...)
fmt.Println("hi", v)
}
将报告v[1]
,但index out of range
不会,为什么?
答案 0 :(得分:3)
v [1:]返回列表类型。在此返回空列表,因为在指定的切片范围内没有任何内容。因此不会引发任何错误。
v [1]试图显式地访问元素。没有返回默认值,因此会引发错误。
答案 1 :(得分:2)
这就是spec定义切片表达式的方式
对于数组或字符串,如果0 <=低<=高<= len(a),则索引在范围内,否则它们超出范围。对于切片,索引的上限是切片容量cap(a)而不是长度。
https://golang.org/ref/spec#Slice_expressions
这就是切片的索引表达式的定义方式
如果0 <= x
如果x在运行时超出范围,则会发生运行时恐慌
https://golang.org/ref/spec#Index_expressions
例如:
v[1]
恐慌,因为它属于上述定义的范围(因为1
不符合0 <= x < len(a)
的要求)
v[1:]
运行正常,因为它与v[1:len(v)]
相同并且符合if 0 <= low <= high <= cap(a)
的要求。
答案 2 :(得分:1)
允许您在最后一个元素之后引用一个空切片,因为这在实现事物时很有用。
例如。
def watermark_text(input_image,
output_image,
text, pos):
photo = Image.open(input_image)
drawing = ImageDraw.Draw(photo)
color = (255, 180, 80)
font = ImageFont.truetype("arial.ttf", 40)
drawing.text(pos, text, fill=color, font=font)
photo.show()
photo.save(output_image)
if __name__ == '__main__':
img = 'cat.jpg'
watermark_text(img, 'cats.jpg',
text='Sample Location Text',
pos=(180, 200))
...如果s [1:1]在1字节切片上不起作用,则最后一次删除将无效。