Go编程基础-项目与坑

1350368559 · · 926 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

项目与坑

slice容量问题

初始容量被超过了,它会新建一个slice,然后把旧的内容拷贝过去,然后append数据,这就会导致底层数组改变了,期望的结果可能就不是预期的了

package main
import("fmt")
func Pingpong(s []int)  {
    s = append(s,3)//原来的容量为0,append之后,重新分配了内存地址,s跟原来的slice s已经不是同一个了
}
func main(){
    s := make([]int,0) //初始化slice s,初始容量为0,长度为0
    fmt.Println(s)
    Pingpong(s)
    fmt.Println(s)
}
两次打印的slice结果都是空
[]
[]

怎么解决这个问题,真的修改修改slice?增加返回值
package main
import("fmt")
func Pingpong(s []int ) []int { //希望修改slice的,设置返回值,通过返回值去返回数据
    s = append(s,4)//原来的容量为0,append之后,重新分配了内存地址,s跟原来的slice s已经不是同一个了
    return s
    }
func main(){
    s := make([]int, 0) //初始化slice s,初始容量为0,长度为0
    fmt.Println(s)
    s = Pingpong(s) //这里取出返回值
    fmt.Println(s)
}

[]
[4]

time,用t.Format(time.ANSIC或者t.Format("Mon Jan _2 15:04:05 2006"这里不能调整,否则时间差异极大

package main
import(
    "fmt"
    "time"
)
func main(){
    t := time.Now()
    fmt.Println(t)
}
2018-07-09 11:51:25.906284 +0800 CST m=+0.000278103

如果不想要时区等信息,用format
package main
import(
"fmt"
"time"
)
func main(){
    t := time.Now()
    fmt.Println(t.Format(time.ANSIC))
}
Mon Jul  9 11:54:15 2018

https://gowalker.org/time#_constants
package main
import(
"fmt"
"time"
)
func main(){
    t := time.Now()
    fmt.Println(t.Format("Mon Jan _2 15:04:05 2006")) //这里是标准的对比时间,不能改变吗,否则差异很大
}
Mon Jul  9 11:58:18 2018

https://gowalker.org/time#_constants
package main
import(
"fmt"
"time"
)
func main(){
    t := time.Now()
    fmt.Println(t.Format("Mon Jan _2 15:04:05 2006"))
}
Mon Jul  9 11:59:48 2018

range、for range与闭包的坑

package main
import(
"fmt"
)
func main(){
    s := []string{"a","b","c"}
    for _,v := range s{
        go func() { //通过for range启动doroutine,不用参数穿进去的值都是引用闭包的思想
            fmt.Println(v)//这里都是引用了v的地址,v全等于c
        }()
    }
    select { //为了防止main退出,写死slect
    }
}
c
c
c
fatal error: all goroutines are asleep - deadlock!

package main
import(
"fmt"
)
func main(){
    s := []string{"a","b","c"}
    for _,v := range s{
        go func(v string) { //通过for range启动doroutine,不用参数穿进去的值都是引用闭包的思想
            fmt.Println(v)//这里都是引用了v的地址,v全等于c
        }(v)
    }
    select { //为了防止main退出,写死slect
    }
}
c //这里输出a和b,并不全是c
b
a

有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:1350368559

查看原文:Go编程基础-项目与坑

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

926 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传