go append 的疑问

2023-02-27 11:46:28 +08:00
 echoless
package main

import "fmt"

func main() {
	// create a slice from an array
	x := [3]string{"A", "B", "С"}
	s := x[:] // a slice referencing the storage of x
	// x[1] = "O"
	t := append(s, "D") // append items to slice s
	x[1] = "O"
	fmt.Println("%+v", x)
	fmt.Println("%+v", s)
	fmt.Println("%+v", t)
}

https://go.dev/play/p/g-eGRJLteAH

t 为什么是 [A B С D]

我的理解是 t 在 s 的基础上加了个‘D' , x 改了 s, t 也要跟着变啊.

1973 次点击
所在节点    Go 编程语言
41 条回复
echoless
2023-02-27 12:27:00 +08:00
@hzjseasea #15 https://www.v2ex.com/t/919283#reply22

看了这个我真是...

这阵容估计只有 c++ 可以一拼了吧.
lesismal
2023-02-27 12:27:09 +08:00
@MoYi123
> 不是 go 比 java 多了指针, 而是 java 比 go 少了指针.

这话说的妙极了
echoless
2023-02-27 12:31:59 +08:00
@hzjseasea #20 大佬你适合去搞汇编
echoless
2023-02-27 12:59:07 +08:00
https://books.studygolang.com/GoExpertProgramming/chapter01/1.2-slice.html

https://go.dev/play/p/mgax2-QsRKI

package main

import (
"fmt"
)

func AddElement(slice []int, e int) []int {
return append(slice, e)
}

func main() {
var slice []int
slice = append(slice, 1, 2, 3)

newSlice := AddElement(slice, 4)
fmt.Println(&slice[0] == &newSlice[0])
}


专家都搞不清

我一个新手很快能摸到坑也是不容易.
Nazz
2023-02-27 13:23:22 +08:00
设计成 OOP 风格明显会更好,之所以没有大概是因为泛型
hsfzxjy
2023-02-27 13:31:40 +08:00
学过 c 的就感觉很自然,类似 realloc 的行为
echoless
2023-02-27 13:33:28 +08:00
@lesismal less is more go 语言的爹经常说的
leonshaw
2023-02-27 13:43:32 +08:00
像 rust 的 ownership 一样,自己制定一些规则,例如只能通过一个 owner slice append ,append 以后其它相关 slice 都失效。
zagfai
2023-02-27 14:28:35 +08:00
@lesismal 为什么觉得是圈养了 curder 而不是技术发展提高了生产力了?现在没人钻木取火了吧?
lanlanye
2023-02-27 14:29:01 +08:00
因为 slice 底下是固定大小的数组,不够了要扩容+copy ,你可以试试用 make 来指定底层数组的大小,只要不超过这个大小就不会出现问题。
但归根结底,不知道这个就容易踩坑。
lesismal
2023-02-27 14:29:54 +08:00
@wuhaoecho
go 爹说的没毛病,我的这个 id (les is mal)也是 less is more 缩写拼接变换得到的
很多人嘲讽 go 大道至简,殊不知是他们习惯了搬砖的工作、而 go 不是只为了简单搬砖。。。
lesismal
2023-02-27 14:31:08 +08:00
先走出自己的舒适区,然后不知不觉就破境了
lesismal
2023-02-27 14:51:54 +08:00
@zagfai
你看 #19 我那句的完整顺序:
1. 先说的 “为了搬砖效率” —— 这个就是提高了部分生产力,因为提高的主要是开发效率 /速度、性能和软硬件消耗的成本是不划算的
2. 然后才说的“圈养了大批 CURDer”

科技线的演化规律通常是不同技术潮涨潮落逐步更迭到更好的,相比于 java ,go 的性能和消耗更友好,目前在一些其他语言舒适区使用者眼里,go 开发效率差很多,但毕竟出生的晚,随着逐步完善、开发效率越来越高,而且就我自己而言从来没觉得用 go 比用其他语言开发效率低。

但 go 性能不够强,只能做第二梯队、在开发效率与性能消耗之前均衡,在 CURD 与基础设施以及这两者的一些中间过渡领域会有很多作为。

往远一点看,rust 会大量占市场,目前阶段是 rust 已经进入,比如 linux 内核,比如 tidb 这种搞数据库的,比如 cloudflare 的一些基础设施:
https://mp.weixin.qq.com/s/1dB4P54tVz-aM2iYIkE4fg

再往远一点看,AI 的发展,未来大部分代码可能会是由 AI 直接生成更高性能的机器码,等到 NLP 、AI 编码更牛逼了,人类需求直接丢给 AI 了,配合上更丰富完善的测试验收体系。全盘丢给 AI 怕它作恶像终结者那样反噬人类,所以你看,OpenAI 的核心宗旨在于“实现安全的通用人工智能(AGI)”,使其有益于人类

性能是效率的永恒核心,是生产力的核心,现阶段你觉得够用了,并不代表其他人、next gen 也觉得性能够用。所以不要觉得 java 那些提高了生产力就没必要 go 和 rust 了,那只是 CURDer 这些不需要性能的人在坐井观天或者自欺欺人罢了
lesismal
2023-02-27 14:57:00 +08:00
@zagfai
go rust 或者 c/cpp ,不是钻木取火。
如果这些是钻木取火,未来 AI 写代码成熟了,那时候的人同样也会说用 java php 这些是钻木取火、谁还自己写代码啊!?

过去这十几年,IT 这条线发展太快了,不知道 AI 迭代的速度会有多快,有生之年是否能见识到机器生命雏形甚至更高阶一点:joy:
pkoukk
2023-02-27 18:39:23 +08:00
不扩容之前,slice 指向底层的 array 不会变,扩容之后就变了
所以不建议 x := [3]string{"A", "B", "С"}这么用
一开始就 x:=[]string{},之后 append 也是 x=append(x,...)
echoless
2023-02-28 10:04:32 +08:00
@pkoukk #35 https://go.dev/play/p/tMshcyKhLSU 用 x := []string{"A", "B", "С"} 结果是一样的.
pkoukk
2023-02-28 10:28:24 +08:00
@echoless 你别光看前半句不看后半句啊....
echoless
2023-02-28 10:37:47 +08:00
@pkoukk #37 哈哈 你的观点楼上有人提过, 就是要最佳实践, 其实就是把负担留给程序员.

问题是这玩意可是面试官, 考试最喜欢的.

反正这个 append 我的坑 我是踩过了.
zagfai
2023-02-28 12:31:36 +08:00
@lesismal 别误会。。我不是说 java 很好,我不仅说 go 是钻木取火,java ,rust 也是。连无穷整型都不是 builtin 的,都是比胶水 python 低一个层次的抽象。
性能和开发效率的极致得占一个吧~而不是像 go
echoless
2023-02-28 12:37:50 +08:00
@zagfai #39 现在这些语言就是 features 取舍的组合, go 我觉得就是宣传过头, 做一些 infra 的工具还行. 大公司做一些高并发啥的也可以理解, 小公司跟风上 go 去写 crud 感觉是无法理解的(动不动 BAT 谁谁都用了, nnd 是处理一样的问题么).

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX