Golang中国

rockman

闻道有先后,术业有专攻

Golang China 第 5135 号会员,加入于 2016-03-24 18:04



Golang爱好者

rockman最近回复了


回复了 Zhangyc310 创建的主题: 如果根据不同的域名,选择不同的handler 2016-10-11 15:21

使用Host-specific pattern for ServeMux

Host Multiple Domains in a Single Golang HTTP Server

To host multiple domains in a single Golang HTTP server, we need to use Host-specific pattern for ServeMux:

Patterns may optionally begin with a host name, restricting matches to URLs on that host only. Host-specific patterns take precedence over general patterns, so that a handler might register for the two patterns “/codesearch” and “codesearch.google.com/“ without also taking over requests for “http://www.google.com/“.

// For Example:
func main() {
    http.HandleFunc("a.com/", helloA)
    http.HandleFunc("sub.a.com/", helloSubA)
    http.HandleFunc("b.com/", helloB)

    if err := http.ListenAndServe(":80", nil); err != nil {
        log.Fatal(err)
    }
}

Example

References

原文链接:
Host Multiple Domains in a Single Golang HTTP Server)

回复了 panjjo 创建的主题: 使用Redis 连接池客户端出现大量TIME_WAIT的链接,是我用法有问题么? 2016-10-10 15:11

先完全用Redigo的官方示例的newPool()替换自己的试试看:

func newPool(server, password string) *redis.Pool {
    return &redis.Pool{
        MaxIdle: 3,
        IdleTimeout: 240 * time.Second,
        Dial: func () (redis.Conn, error) {
            c, err := redis.Dial("tcp", server)
            if err != nil {
                return nil, err
            }
            if _, err := c.Do("AUTH", password); err != nil {
                c.Close()
                return nil, err
            }
            return c, err
        },
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            if time.Since(t) < time.Minute {
                return nil
            }
            _, err := c.Do("PING")
            return err
        },
    }
}
回复了 shuaixinga 创建的主题: 学习GOLANG很久,还是感觉struct和interface很乱,如何解决? 2016-09-11 19:17

stevewang说的很对。

比如在HTTP服务中动态生成一个压缩包,然后作为response。就可以使用http.ResponseWriter作为参数。

回复了 zbzpo2002 创建的主题: Golang.org竟然能访问了? 为啥? 这个不是真的吧? 2016-09-06 10:58

上海昨天,今天可以访问。
不过还是通过绕的方法啊,希望这次能长久。

昨天安装go get 安装gin的时候看到golang.org/x/net可以安装成功。

回复了 nulijiabei 创建的主题: 谁能提供比较详细的 "golang.org/x/net/context" 使用介绍(中文的) 2016-08-26 21:11

多谢@andylau004的分享。

另外,Google的ctxhttp就用到context:
https://github.com/golang/net/tree/master/context/ctxhttp

果然1.7中已经是标准库了。

回复了 Nixus 创建的主题: golang Web 开发路径为什么是~即/Users/mac/,而不是编译后的文件所在目录? 2016-07-21 11:38

如果访问的是静态资源,那么是应该使用绝对路径

  1. 先得到go程序运行所在的绝对路径
  2. 拼接资源的相对路径,得到资源的绝对路径

Get Current Executable Directory in golang

os.Getwd() will NOT return current executable dir.

  • Getwd returns a rooted path name corresponding to the current directory(See https://godoc.org/os#Getwd).
  • It’s similar to pwd command.
  • Example Code

      package main
    
      import (
              "fmt"
              "os"
      )
    
      func main() {
              dir, _ := os.Getwd()
              fmt.Printf("os.Getwd(): %v\n", dir)
      }
    
  • Test

    • Run the program under the same dir as go project

      • cd /home/xx/projects-go/src/github.com/northbright/getwd-test
      • ./getwd-test
      • the result is: os.Getwd(): /home/xx/projects-go/src/github.com/northbright/getwd-test
    • Run the program under user home

      • cd /home/xx
      • ./projects-go/src/github.com/northbright/getwd-test/getwd-test
      • the result is: os.Getwd(): /home/xx

Solution

import (
    "fmt"
    "os"
    "os/exec"
    "path/filepath"
)

func GetCurrentExecDir() (dir string, err error) {
    path, err := exec.LookPath(os.Args[0])
    if err != nil {
        fmt.Printf("exec.LookPath(%s), err: %s\n", os.Args[0], err)
        return "", err
    }

    absPath, err := filepath.Abs(path)
    if err != nil {
        fmt.Printf("filepath.Abs(%s), err: %s\n", path, err)
        return "", err
    }

    dir = filepath.Dir(absPath)

    return dir, nil
}

References

回复了 rockman 创建的主题: 今天突然发现Golang.org可以访问了 2016-06-29 12:13

自己更新下:中午12点左右不能访问了。
不过这次持续能访问的时间算是比较长的。

回复了 ericyhz 创建的主题: 新人学golang,遇到个很基础的题目求解!传入一个[]int切片 返回切片的副本,但是将其中的重复内容删掉怎么写?以下代码问题在哪里? 2016-06-16 16:58

如果没有限制,可以利用map的key是否存在来过滤

package main

import "fmt"

func UniqueInts(a []int) (b []int) {
    m := map[int]bool{}

    for _, v := range a {
        if _, ok := m[v]; !ok {
            b = append(b, v)
            m[v] = true
        }
    }

    return b
}

func main() {
    s := []int{9, 1, 9, 5, 4, 4, 2, 1, 5, 4, 8, 8, 4, 3, 6, 9, 5, 7, 5}
    s1 := UniqueInts(s)
    fmt.Printf("Unique Ints: %v\n", s1)
}
回复了 gjialin 创建的主题: 问个关于smtp.SendMail密码的小白问题 2016-03-25 18:37

如果Golang的二进制是存放在服务器端,等到被逆向的时候说明服务器已经被攻破。如果服务器被攻破,也不存在所谓的任何安全了,包括keys。

个人意见:

  • 尽量保证服务器本身的安全
  • 服务器上的service/程序的密码明文存贮即可
    例如: redis的密码就是明文存放在redis.conf中
  • 如果代码可能有途径被泄漏,这个才是需要解决最大的危险
rockman 创建的更多回复