存档
Go(golang) FastCGI Client
最近用Go语言写给legendbase.com写网站的时候实现了个MVC框架,原理是根据uri请求,用reflect方法找到相应的controller跟method,然后执行之.当没有找到就根据uri后缀是否是php,如果是则调用fastcig-client执行配置目录下的php文件.如果再没有就写404错误. Go语言官方package没有client的实现,于是花了点功夫实现了个,开源出来,给需要的朋友节省点时间.
地址: http://code.google.com/p/go-fastcgi-client/
使用示例:
reqParams := "name=value"
env := make(map[string]string)
env["REQUEST_METHOD"] = "GET"
env["SCRIPT_FILENAME"] = "/Users/ivan/work/test/fcgi/test.php"
env["SERVER_SOFTWARE"] = "go / fcgiclient "
env["REMOTE_ADDR"] = "127.0.0.1"
env["SERVER_PROTOCOL"] = "HTTP/1.1"
env["QUERY_STRING"] = reqParams
fcgi, err := fcgiclient.New("127.0.0.1", 9000)
if err != nil {
fmt.Printf("err: %v", err)
}
content, err := fcgi.Request(env, reqParams)
if err != nil {
fmt.Printf("err: %v", err)
}
fmt.Printf("content: %s", content)
}
MySQL driver(驱动) liblbmysql for Go1
Go语言1.0出来之后,原来可用的MySQL驱动在新版本上基本不可用了,于是这几天自己写了个简单的MySQL的驱动,暂不支持prepare,没有implement sql/driver. 或许有能用的上的朋友,所以分享出来. 先介绍用法,后面提供下载链接.
先直接上例子
import (
"log"
"liblbmysql"
)
func main() {
settings := make(map[string]interface{})
settings["host"] = "localhost"
settings["port"] = 3306
settings["uname"] = "ivan"
settings["pass"] = "******"
settings["dbname"] = "test"
settings["charset"] = "utf8"
conn, err := liblbmysql.Connect(settings)
if err != nil {
log.Fatal("Connect to MySQL error: %v", err)
}
var qr *liblbmysql.QueryResult
qr, err = conn.ExecuteFetch("select * from ivan")
if err != nil {
log.Printf("query error: %v", err)
} else {
for {
m := qr.FetchMap()
if m != nil {
log.Printf("row map: %v\n", m)
} else {
break
}
}
}
qr.Free()
conn.Close()
}
daemon function for Go language(golang)(fixed for mac/darwin)
package main
import (
"syscall"
"os"
"log"
)
func daemon(nochdir, noclose int) int {
var ret, ret2 uintptr
var err uintptr
darwin := syscall.OS == "darwin"
// already a daemon
if syscall.Getppid() == 1 {
return 0
}
// fork off the parent process
ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}
// failure
if ret2 < 0 {
os.Exit(-1)
}
// handle exception for darwin
if darwin && ret2 == 1 {
ret = 0
}
// if we got a good PID, then we call exit the parent process.
if ret > 0 {
os.Exit(0)
}
/* Change the file mode mask */
_ = syscall.Umask(0)
// create a new SID for the child process
s_ret, s_errno := syscall.Setsid()
if s_errno != 0 {
log.Printf("Error: syscall.Setsid errno: %d", s_errno)
}
if s_ret < 0 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := f.Fd()
syscall.Dup2(fd, os.Stdin.Fd())
syscall.Dup2(fd, os.Stdout.Fd())
syscall.Dup2(fd, os.Stderr.Fd())
}
}
return 0
}
// usage example: daemon(0, 0)
参考:http://code.google.com/p/go/issues/detail?id=227
最近评论