一、Go
1、nil是否一定相等
package mainimport ("fmt"
)func main(){var x *int =nilvar y interface{} =xfmt.Println(x==y) //truefmt.Println(x==nil) //truefmt.Println(y==nil) //false
}
2、Go会不会回收线程
package mainimport ("fmt""net""runtime/pprof""sync"
)var threadProfile = pprof.Lookup("threadcreate")func main() {fmt.Printf("协程执行之前的线程数:%d\n", threadProfile.Count())var wg sync.WaitGroupwg.Add(100)for i := 0; i < 100; i++ {go func() {defer wg.Done()//runtime.LockOSThread() //强制回收线程for j := 0; j < 100; j++ {_, err := net.LookupHost("www.baidu.com")if err != nil {fmt.Println("err=", err)}}}()}wg.Wait()fmt.Printf("协程执行之后的线程数:%d\n", threadProfile.Count())
}
结果:
协程执行之前的线程数:6
协程执行之后的线程数:108
暂时不会回收,go还没解决此问题
3、slice扩容
package mainimport "fmt"//少于1024双倍扩容,大于1024是1.25倍扩容
//单个append
// 1024*1.25=1280
// 1024*1.25*8=10240 查runtime/sizeclasses.go 表 10240/8=1280// 批量
// 1025*8=8200 查runtime/sizeclasses.go 表 9472/8=1184
func main() {var arr []int64var arr1 []int64for i := 0; i < 1025; i++ {arr = append(arr, int64(i))}fmt.Printf("len=%d,cap=%d\n", len(arr), cap(arr))arr1 = append(arr1, arr...)fmt.Printf("len=%d,cap=%d\n", len(arr1), cap(arr1))
}
难留少年时,总有少年来!
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!