golang 使用make、new和append的注意细节

本文总结了在Golang中使用append向slice追加元素时可能遇到的问题,如元素前出现空格、类型匹配错误以及new和make的区别。通过示例代码,解释了append总是从slice尾部追加,可能导致内存重新分配,以及append操作切片时需注意的类型转换。此外,详细阐述了new仅分配并置零内存,而make用于初始化slice、map和channel。
摘要由CSDN通过智能技术生成

使用append向slice追加元素遇到的坑,在此总结一下。

一,细节1

urls := make(map[string]string, 3) 
urls["baidu"] = "www.baidu.com"
urls["google"] = "www.google.com"
urls["csdn"] = "www.csdn.net"
names := make([]string, len(urls))
for key, _ := range urls {
    names = append(names, key)
    }
fmt.Println(names,len(names))

输出结果
[ csdn baidu google] 6
前面多了几个空格,长度为6,与预期的结果不一致
修改代码

names := make([]string, 0)
for key, _ := range urls {
    names = append(names, key)
}
fmt.Println(names,len(names))

或者

var names []string
for key, _ := range urls {
    names = append(names, key)
}
fmt.Println(names,len(names))

输出结果
[baidu google csdn] 3
总结:append无论如何都是从slice的尾部开始追加数据,原来的slice只有3个长度,现在每一次append都要重新分配一次内存

Golang烟花代码是一种使用Go语言编写的模拟烟花爆炸效果的程序。它通过使用Golang的图形库和并发机制,实现了烟花在屏幕上绽放的效果。 以下是一个简单的Golang烟花代码示例: ```go package main import ( "fmt" "math/rand" "time" "github.com/fogleman/gg" ) const ( width = 800 height = 600 ) type Particle struct { X, Y float64 VX, VY float64 Life int Color string Sparkles []Sparkle } type Sparkle struct { X, Y float64 VX, VY float64 Life int Color string } func main() { dc := gg.NewContext(width, height) dc.SetRGB(0, 0, 0) dc.Clear() particles := make([]Particle, 0) for i := 0; i < 100; i++ { p := Particle{ X: width / 2, Y: height, VX: rand.Float64()*6 - 3, VY: -rand.Float64()*5 - 5, Life: rand.Intn(60) + 60, Color: fmt.Sprintf("#%06x", rand.Intn(0xffffff)), } particles = append(particles, p) } for len(particles) > 0 { dc.Clear() for i := len(particles) - 1; i >= 0; i-- { p := &particles[i] dc.SetRGB255(parseColor(p.Color)) dc.DrawPoint(p.X, p.Y, 1) p.X += p.VX p.Y += p.VY p.VY += 0.1 p.Life-- if p.Life <= 0 { particles = append(particles[:i], particles[i+1:]...) continue } for j := len(p.Sparkles) - 1; j >= 0; j-- { s := &p.Sparkles[j] dc.SetRGB255(parseColor(s.Color)) dc.DrawPoint(s.X, s.Y, 1) s.X += s.VX s.Y += s.VY s.VY += 0.1 s.Life-- if s.Life <= 0 { p.Sparkles = append(p.Sparkles[:j], p.Sparkles[j+1:]...) } } if rand.Float64() < 0.02 { s := Sparkle{ X: p.X, Y: p.Y, VX: rand.Float64()*6 - 3, VY: rand.Float64()*6 - 3, Life: rand.Intn(20) + 20, Color: fmt.Sprintf("#%06x", rand.Intn(0xffffff)), } p.Sparkles = append(p.Sparkles, s) } } dc.Stroke() dc.SavePNG("fireworks.png") time.Sleep(time.Millisecond * 10) } } func parseColor(color string) (int, int, int) { var r, g, b int fmt.Sscanf(color, "#%02x%02x%02x", &r, &g, &b) return r, g, b } ``` 这段代码使用了第三方库`github.com/fogleman/gg`来进行图形绘制。它模拟了烟花的爆炸效果,通过不断更新粒子的位置和颜色,实现了烟花在屏幕上绽放的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值