自己用到的golang工具类方法
2018年7月2日
有时候我们需要获取本地的ip地址,在window 上我们可以用ipconfig,linux上用ifconfig,但是我们程序要拿到,用两个命令就必须进行解析才可以!但golang提供了一个方法可以拿到本地的ip地址,那就是net.InterfaceAddrs() 这个方法会获取本地的ip地址,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//获取本地ip列表,返回格式如下: //[]string{192.168.1.1,127.0.0.1} func GetLocalIp() ([]string, error) { addr, err := net.InterfaceAddrs() var ips []string if err != nil { return ips, err } for _, v := range addr { ip := v.String() n := strings.Index(ip, "/") ips = append(ips, ip[0:n]) } return ips, nil } |
golang中也经常用到判断文件是否或者文件是否存在:
1 2 3 4 5 6 7 8 9 10 11 |
//判断文件是否存在 func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err } |
另外在http请求的时候,我们可能也需要对body进行压缩或者解压缩,现编看看常用解压缩在golang中的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
func Parsecode(code, body string) string { switch code { case "gzip": b := strings.NewReader(body) gz, err := gzip.NewReader(b) if err != nil { return body } b1, _ := ioutil.ReadAll(gz) return string(b1) case "deflate": b := strings.NewReader(body) gz, err := zlib.NewReader(b) if err != nil { return body } b1, _ := ioutil.ReadAll(gz) return string(b1) case "flate": b := strings.NewReader(body) gz := flate.NewReader(b) b1, _ := ioutil.ReadAll(gz) return string(b1) default: return body } } |
golang中获取ip的方法,这里你可能疑问,怎么会在header中获取呢,而且名称是X-Real-Ip呢,这个是因为golang建立的web服务一般不会直接对外,前边一般都会加一层nginx代理,所以golang要是获取remote_ip就是nginx的地址啦,所以这个X-Real-Ip是nginx层把remote_ip赋值给的,这样X-Real-Ip在golang中header拿到实际上就是用户的ip!
1 2 3 4 5 6 7 8 9 10 11 12 |
func GetIp(r *http.Request) string { ip := r.Header.Get("X-Real-Ip") if ip == "" { ip = r.RemoteAddr ips := strings.Split(ip, ":") ip = ips[0] if ip == "[" { ip = "localhost" } } return ip } |