热门IT资讯网

Go编程基础3-项目与坑

发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,项目与坑slice容量问题初始容量被超过了,它会新建一个slice,然后把旧的内容拷贝过去,然后append数据,这就会导致底层数组改变了,期望的结果可能就不是预期的了package mainimpo

项目与坑

slice容量问题

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

package mainimport("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 mainimport("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 mainimport(    "fmt"    "time")func main(){    t := time.Now()    fmt.Println(t)}2018-07-09 11:51:25.906284 +0800 CST m=+0.000278103如果不想要时区等信息,用formatpackage mainimport("fmt""time")func main(){    t := time.Now()    fmt.Println(t.Format(time.ANSIC))}Mon Jul  9 11:54:15 2018https://gowalker.org/time#_constantspackage mainimport("fmt""time")func main(){    t := time.Now()    fmt.Println(t.Format("Mon Jan _2 15:04:05 2006")) //这里是标准的对比时间,不能改变吗,否则差异很大}Mon Jul  9 11:58:18 2018https://gowalker.org/time#_constantspackage mainimport("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 mainimport("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    }}cccfatal error: all goroutines are asleep - deadlock!package mainimport("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,并不全是cba
0