vps测试

最方便,便宜是搬瓦工(bandwagonhost),就是速度不快,有时候连不上稳定性不够。平常查资料,用谷歌也还可以的。

采用的方案是:搬瓦工 洛杉矶机房 openvz  年付费19.9vps ,Shadowsocks server +kcptun

openvz vps bandwagonhost

最近推出了kvm cn2的线路,买了一个测试了一下:Shadowsocks server +bbr 测试了一下感觉。也是和上面的速度差不多(同样是洛杉矶机房)。没有感觉到网上别人测试得到的成倍提升。可能分配vps的时候运气比较差。

 

宇宙最快:Google云平台建的虚拟机。

开启了bbr+shadowsocks速度是搬瓦工的十倍。机房选择的是asia-east1-a,网上说这是台湾机房。

客户端测试延迟是25ms,上YouTube:

google大法好

就是Google收费太贵了,费用由vm和流量两部分构成:

vm采用的按时收费,我选的最低配置:1共享vcpu +0.6GB内存+标准永久10GB磁盘:有效的每小时费率为 0.007(每月 730 小时) 网络流量计费:有效的每小时费率为0.023。(google 产品流量不计费,例如:上youtube的流量不计费)

还好Google提供开户绑定信用卡免费试用一年,现在我就在用。

go函数返回数组

Defining a function that returns a slice of variable size in golang

First of all, slices are already of “variable size”: [100]int and […]int are array type definitions.
[]int is the correct syntax for a slice, and you could implement the function as:

func BuildSlice(size int) []int {
    return make([]int, size)
}
The built-in function make takes a type T, which must be a slice, map or channel type, optionally followed by a type-specific list of expressions. It returns a value of type T (not *T). The memory is initialized as described in the section on initial values.

Call             Type T     Result

make(T, n)       slice      slice of type T with length n and capacity n
make(T, n, m)    slice      slice of type T with length n and capacity m

The size arguments n and m must be of integer type or untyped. A constant size argument must be non-negative and representable by a value of type int. If both n and m are provided and are constant, then n must be no larger than m. If n is negative or larger than m at run time, a run-time panic occurs.

s := make([]int, 10, 100)       // slice with len(s) == 10, cap(s) == 100
s := make([]int, 1e3)           // slice with len(s) == cap(s) == 1000
s := make([]int, 1<<63) // illegal: len(s) is not representable by a value of type int s := make([]int, 10, 0) // illegal: len(s) > cap(s)
func obtainNext(str string) []int {
   sLen := len(str)
   next := make([]int, sLen)
   next[0] = -1
   k, j := -1, 0
   for j < sLen-1 {
      if k == -1 || str[j] == str[k] {
         k++
         j++
         next[j] = k
      } else {
         k = next[k]
      }
   }
   return next
}

闭包

以前看js的时候,老是说,闭包闭包,但是一直搞不清楚,感觉就像个函数。最近看go,看到这篇文章,感觉有点明了。
Go by Example 中文:闭包
在我看来,闭包就是匿名函数使用了外部变量。

在wiki里的描述:
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
在没有闭包的语言中,变量的生命周期只限于创建它的环境。但在有闭包的语言中,只要有一个闭包引用了这个变量,它就会一直存在。清理不被任何函数引用的变量的工作通常由垃圾回收完成

package main

import "fmt"

func intSeq() func() int {
   i := 0
   return func() int {
      i = i + 1
      return i
   }
}

func main() {
   nextInt := intSeq();
   fmt.Println(nextInt())
   fmt.Println(nextInt())
   fmt.Println(nextInt())
   fmt.Println(nextInt())
   fmt.Println(nextInt())

   fmt.Println("-------")
   nextInt2 := intSeq();
   fmt.Println(nextInt2())

   fmt.Println("-------")
}