Golang Go语言实现Virtualhost虚拟主机效果

如果是单个域名,使用没啥好说的一个 http.HandleFunc 来给这个域名注册URL规则就行了。如果是多个域名呢?因为不同的域名就会有不同的规则,所以得分别注册URL规则。当然你也可以分开到另一个go文件中来管理。这里只说同时来管理的情况。

package main

import (
    "http"
)

func hf1(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world from host1"))
}

func hf2(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world from host2"))
}

func main() {
    sm1 := http.NewServeMux()
    sm2 := http.NewServeMux()
    sm1.HandleFunc("/", hf1)
    sm2.HandleFunc("/", hf2)
    http.Handle("www.kejibo1.com/", sm1)
    http.Handle("www.kejibo2.com/", sm2)
    http.ListenAndServe(":80", nil)  //注册到默认的 DefaultServeMux上面,来管理所有域名
}

如果要增加域名规则就分别添加 sm1.HandleFunc(“/”, hf1) 或 sm2.HandleFunc(“/”, hf2) 这样注册方法。

你可能会怀疑注册这样的域名方法,会不会 www.kejibo.com/www.kejibo1.com/ 也会被注册到了 sm1上面呢?通过测试可以发现,并不会。

Golang Go语言简单的文件服务器

package main

import (
    "http"
)

func main() {
    h := http.FileServer(".", "/google")
    http.ListenAndServe(":8888", h)
}

http.FileServer的第一个参数为提供服务的目录,第二参数为前缀名,一般情况下为空就可以。如果你想 http://youserver/prefix/ 这种形式访问到你所提供服务的目录就要把这个参数设置为 /prefix

PPPOE宽带连接或ADSL连接下使用Chrome Proxy Switchy

社区使用的网络突然从DHCP网转成PPPOE拔号网,突然发现Proxy Switchy不能用了。还以为是墙升级了。不过搜一下发现是宽带连接的问题。

修改宽带连接的名称,为英文或数字。

进入 Proxy Switchy 设置,进【Network】面板,选择【Proxy For VPN/Dial-up】,选择刚刚修改了名称的宽带连接。

保存设置。

重启一下电脑(必须的。)。

Facebook秘密雇佣公关公司中伤Google被曝光(邮件)

google-facebook.jpg

Facebook这次真的玩大了,他们秘密雇佣公关公司Burson Marsteller帮助其在各大著名媒体上发表中伤Google的文章的事情被曝光了。

此事的曝光还源于Burson Mersteller公司的一次大意,他们不小心找了一个不太那么愿意助人为恶的博客人去写一篇关于Google侵犯别人隐私的文章。该博客人不但没有写下这样一篇文章,还直接把Burson公司发给他的邮件曝光了出来。


点此
可查看邮件原文。

公司之间的竞争是常有的事,Facebook这次确实是走得太远了,连不作恶的Google他们都去伤害,我们可以想象其在背后不知到还做了多少伤人的事。

文章来自
36氪

用Golang Go语言写个http代理服务器

Go的http包封装的实在很BT,几十行代码就能写个http代理服务器。支持get,post,支持cookie,支持gzip。对了需要使用最新的源码编译,不然会有BUG。自己hg 下载源码编译一下才行,最新的一个BUG刚刚被修正。不多说直接上代码。

package main

import (
    "http"
    "log"
    "os"
    "io/ioutil"
)

func handler(w http.ResponseWriter, r *http.Request) {
    resp, err := http.DefaultClient.Do(r)
    defer resp.Body.Close()
    if err != nil { panic(err) }
    for k, v := range resp.Header {
        for _, vv := range v {
            w.Header().Add(k, vv)
        }
    }
    for _, c := range resp.SetCookie {
        w.Header().Add("Set-Cookie", c.Raw)
    }
    w.WriteHeader(resp.StatusCode)
    result, err := ioutil.ReadAll(resp.Body)
    if err != nil && err != os.EOF { panic(err) }
    w.Write(result)
}

func main() {
    http.HandleFunc("/", handler)
    log.Println("Start serving on port 8888")
    http.ListenAndServe(":8888", nil)
    os.Exit(0)
}

原创文章转载请注明出明出处,

http://kejibo.com/golang-http-proxy-server/

Google App Engine GAE正式开始支持Golang Go语言

GAE,2007年发布的只支持Python,2009增加了Java的支持,今天就在 Google IO大会上,GAE正式宣布支持Google自己的主导的编程语言Go,Go语言。

GAE for Go的SDK已经可以下载了,而且将很快可以让你的GoApp运行在App Engine架构之上。现在,通过SDK,你可以编写应用,学习API,可以在本地运行测试应用。一旦Google启动全面部署,你就可以很简单地把你的应用Push到Google云端。

如果你不想等待,可以想成为可信任的测试者,
点此注册
。这部分用户将成为先期部署用户,在一段测试时间后,GAE for GO将会向所有用户开放。

因为SDK里面已经包含了GO环境,所以只要有SDK你就可以直接写代码,调试程序了。另外不需要自己编译代码,这些都由SDK包帮你自动编译。

SDK里面已经包含了很多标准的GAE API。使用优雅的GO风格封装,像 Datastore,Blobstore,URL Fetch,Mail,User等等,更多的API也将会随环境的开发而增加。

runtime提供了完整的Go语言支持,包含所有标准包,除了几个不能用在App Engine环境中的。像是就没有 unsafe包,syscall包经过了一些裁剪。

虽然也包含了 goroutine及channel,但是当一个go应用运行在App Engine上的时候,只运行在一个线程里面。也就是说,所有goroutine运行在单一的操作系统线程上面,所以同一个客户端请求就不会有CPU并行运行的情况。不过这个限制将来时机到的时候,会去除。

虽然有一些小的限制,但这是实实在在的GO,代码使用源码方式部署,在云端使用64位编译器(6g)来编译,这也使Go成为App Engine上首个真正意义的编译型语言。Go on App Engine让高效代码部署、密集CPU web应用成的梦想成真。

这是
帮助文档

下载SDK

目前 Go App Engine SDK只提供了 Linux 及Mac OS X(10.5及以上)的支持。我们期待windows的支持更快到来。

消息来自
Golang官方博客

Golang Go语言断点续传下载文件

Go虽然是编译型语言但是使用起来跟Python一样轻便。不多说,直接上代码。

package main

import (
    "http"
    "os"
    "io"
    "strconv"
)

const (
    UA = "Golang Downloader from Kejibo.com"
)

func main() {
    f, err := os.OpenFile("./file.exe", os.O_RDWR, 0666)  //其实这里的 O_RDWR应该是 O_RDWR|O_CREATE,也就是文件不存在的情况下就建一个空文件,但是因为windows下还有BUG,如果使用这个O_CREATE,就会直接清空文件,所以这里就不用了这个标志,你自己事先建立好文件。
    if err != nil { panic(err) }
    stat, err := f.Stat()	//获取文件状态
    if err != nil { panic(err) }
    f.Seek(stat.Size, 0)	//把文件指针指到文件末,当然你说为何不直接用 O_APPEND 模式打开,没错是可以。我这里只是试验。
    url := "http://dl.google.com/chrome/install/696.57/chrome_installer.exe"
    var req http.Request
    req.Method = "GET"
    req.UserAgent = UA
    req.Close = true
    req.URL, err = http.ParseURL(url)
    if err != nil { panic(err) }
    header := http.Header{}
    header.Set("Range", "bytes=" + strconv.Itoa64(stat.Size) + "-")
    req.Header = header
    resp, err := http.DefaultClient.Do(&req)
    if err != nil { panic(err) }
    written, err := io.Copy(f, resp.Body)
    if err != nil { panic(err) }
    println("written: ", written)
}

原创文章,转载请注明出处,不然谁还有信心写原创的东西出来分享?

Golang Go语言Array数组与Slice切片的不同

这里使用 reflect 包来反射出数据的类型。

直接上代码

package main

import (
    "fmt"
    "reflect"
)

func main() {
    vs := []interface{}{
        []int{1, 2, 3},                //slice 切片
        []int{1, 2, 3}[:],            //切片再切还是切片
        [3]int{1, 2, 3},              //array 数组,确定数组长度
        [3]int{1, 2, 3}[:],          //数组切一下,切出个 slice切片
        [...]int{1, 2, 3},            //array 数组,由编译器自动计算数组长度。
    }
    for i, v := range(vs) {
        rv := reflect.ValueOf(v)    //进入疯狂的reflect世界
        fmt.Println(i, rv.Kind())
    }
}

最标准的slice切片定义方法:

v := make([]int, 3, 10);     //一个slice,有三个参数 类型、slice长度、slice底层的array长度,即slice的最大容量。

不过普通使用中,不用这么麻烦,直接这样就行了。

v := []int{1,2,3};   //如果没有元素就 v:= []int{} 这里定义的slice元素为3个,且底层array长度为3。相当于下面的代码
v := make([]int, 3, 3)
v[0] = 1
v[1] = 2
v[2] = 3

如果要扩展 slice的大小使用 append添加元素。否则使用 v[4] = 10 这样增加元素的时候会报 索引出错。

Dreamhost使用伪静态时出现”No input file specified.”的错误解决方法

博客重新迁移到Dreamhost主机,不过上传完后,设置完后,浏览网页的出现:”No input file specified.”的错误。

出现这个错误,表明,主机已经支持伪静态了,但是路径映射的时候出现错误,导致服务找不到正确的文件。

之前也是使用dreamhost空间,也是使用同样的配置怎么会没有问题呢?

可以看到现在这个主机php版本是5.25。

可能是DH对apache某些方面的安全性作了加强,造成这样的问题。

解法方法:伪静态的时候不要使用 index.php/$1 这样的路径,直接使用 index.php ,像用的 typecho 伪静态到这个页面的时候,也是可以正常访问到正确的页面。

修改后的 typecho 伪静态文件 .htaccess


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [S=14]

RewriteRule ^rss/*$ /index.php/feed [R=301,L]
RewriteRule ^(.*)$ /index.php [L]

一个相当奇怪的事是,把 index.php 改成 i.php/? 这样任何形式,都是可以正常访问到 index.php。这里的这个i.php必须存在。目前还无法解释原因。

Golang Go语言Echo服务器代码

package main

import (
	"net"
	"io"
)

func main() {
	serv, e := net.Listen("tcp", ":12345")
	if e != nil {
		panic(e)
	}
	defer serv.Close()

	for {
		conn, ce := serv.Accept()
		if ce != nil {
			break
		}
		go func(c net.Conn) {
			io.Copy(c, c)
			c.Close()
		}(conn)
	}
}