Go編程基礎3-項目與坑

項目與坑

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
相關文章
相關標籤/搜索