获取url中的参数及输出到页面的几种方式
func SayHello(w http.ResponseWriter, req *http.Request) { req.Method //获取url的方法 GET or POST request := req.URL.Query() //获取url中的所有参数(get或post) io.WriteString(w, req.FormValue("id")) //获取url的id参数(常用) w.Write([]byte(request["wang"][0])) //发送到HTTP客户端 io.WriteString(w, "hello, world! ") //发送到HTTP客户端 fmt.Fprintf(w, "%s", "hello, world! ") //发送到HTTP客户端 }
获取当前路径
os.Getwd() //执行用户当前所在路径 file, _ := exec.LookPath(os.Args[0])//执行程序所在的绝对路径
变量类型转换
floatTOint int(float) intTOfloat var a int = 2 var b float64 = float64(a) stringTOfloat(32 / 64) f, err := strconv.ParseFloat(s, 32) f, err := strconv.ParseFloat(s, 64) intTOstring var i int = 10 str1 := strconv.Itoa(i) // 通过Itoa方法转换 str2 := fmt.Sprintf("%v", i) // 通过Sprintf方法转换 万能 stringTOint var s string = "1" var i int i, err = strconv.Atoi(s) stringToint strconv.ParseInt() strToBool i, err =strconv.ParseBool("1") intToint32 var a int b = int32(a) interface TO string var a interface{} var b string a = "asdasdasdasd" b = a.(string) interface TO float32 var a interface{} var b float32 a = 126.982577 b = a.(float32) interface TO int32 var a interface{} var b int32 a = 126 b = a.(int32) 强制类型转换 1 type MyInt32 int32 func main() { var uid int32 = 12345 var gid MyInt32 = MyInt32(uid) fmt.Printf("uid=%d, gid=%d ", uid, gid) } 强制类型转换 2 unsafe.Pointer
string byte互转
aa:="hello world"
bb:=[]byte(aa)
cc:=string(bb)
时间篇
当前时间戳 fmt.Println(time.Now().Unix()) # 1389058332 时间戳到具体显示的转化 fmt.Println(time.Unix(t, 0).String()) 带纳秒的时间戳 t = time.Now().UnixNano() 基本格式化的时间表示 fmt.Println(time.Now().String()) 格式化时间 fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 记忆方法:6-1-2-3-4-5 # 2014-01-07 09:42:20 时间戳转str格式化时间 str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05") fmt.Println(str_time) # 2014-01-07 09:32:12 str格式化时间转时间戳 the_time := time.Date(2014, 1, 7, 5, 50, 4, 0, time.Local) unix_time := the_time.Unix() fmt.Println(unix_time) # 389045004 还有一种方法,使用time.Parse the_time, err := time.Parse("2006-01-02 15:04:05", "2014-01-08 09:04:41") if err == nil { unix_time := the_time.Unix() fmt.Println(unix_time) } # 1389171881
sleep
time.Sleep(time.Millisecond * 1000) #sleep 1000毫秒 time.Sleep(time.Second * 1) #sleep 1秒
fmt
万能格式:%v 字符串: %s 十进制: %d 浮点数: %f 保留2位小数 %0.2f 二进制: %b Boolen: %t fmt.Fprintf(os.Stdout, "%08b ", 32) // 00100000 fmt.Printf("%v", "hello world") // hello world 直接格式化打印 fmt.Print(fmt.Sprintf("%v", "hello world")) // hello world Sprintf 返回格式化后的变量 fmt.Print(fmt.Errorf("%08b ", 32)) // 00100000 fmt.Fprint(os.Stdout, "A") fmt.Fprintln(os.Stdout, "A") // A fmt.Println("B") // B fmt.Print(fmt.Sprintln("C")) // C
函数不定参数
func sum (nums ...int) { fmt.Print(nums, " ") //输出如 [1, 2, 3] 之类的数组 total := 0 for _, num := range nums { //要的是值而不是下标 total += num } fmt.Println (total) } a:=[]int{1,2,3,4,5} //可传slice … sum(a…)
执行命令行
import "os/exec" func main () { //cmd := exec.Command("ps", "-aux") cmd := exec.Command ("ls", "/root") out, err := cmd.Output () if err!=nil { println ("Command Error!", err.Error ()) return } fmt.Println (string (out)) } 或者(正规一点) func main () { cmd := exec.Command ("tr", "a-z", "A-Z") cmd.Stdin = strings.NewReader ("some input") var out bytes.Buffer cmd.Stdout = &out err := cmd.Run () if err != nil { log.Fatal (err) } fmt.Printf("in all caps: %q ", out.String ()) } 输出:in all caps: "SOME INPUT"
命令行参数 (可用flag包)
func main () { args := os.Args fmt.Println (args) //带执行文件的 } $go run args.go aaa bbb ccc ddd
生成随机数
r := rand.New(rand.NewSource(time.Now().UnixNano())) //使用时间作为种子
结构体的初始化方法
rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{100, height:200} var rect5 *Rect=new(Rect) 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符 a := Rect{} 则表示这个是一个Rect{}类型
md5
import ( "crypto/md5" "encoding/hex" ) func GetMd5String(s string) string { h := md5.New() h.Write([]byte(s)) return hex.EncodeToString(h.Sum(nil)) }
urlencode
import "net/url"
url.QueryEscape("strings")
log 记日志
logfile, _ := os.OpenFile("./pro.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777) defer logfile.Close() logger := log.New(logfile, "", 0) logger.Printf("%v%v", err, ret)
判断文件是否存在
func main() { f, err := os.Open("dotcoo.com.txt") defer f.Close() if err != nil && os.IsNotExist(err) { fmt.Printf("file not exist! ") return } fmt.Printf("file exist! ") }
string如果里面有"或换行,可以使用`来进行包含
jsonString := ` { "development":{ "connector":[ {"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "wsPort":3050} ], "gate":[ {"id": "gate-server-1", "host": "127.0.0.1", "wsPort": 3014} ] } }`
path.Clean
path.Clean用于对路径 ../../等进行过滤,在创建修改文件的时候需要使用到,否则会有漏洞
import包命名
import的包可以给它命名import l4g "code.google.com/p/log4go"
判断当前用户是否是root用户
os.Geteuid() != 0
break 退出指定的循环体 如果在某个条件下,你需要从 for-select 中退出,就需要使用标签
sum := 0 MyForLable: for { for i := 0; i < 10; i++ { if sum > 200 { break MyForLable //将退出循环体for{} } sum += i } } fmt.Println(sum)
golang 通过go-sql-driver/mysql 调取存储过程报错
Error 1312: PROCEDURE mydb.GetAllNotes can't return a result set in the given context
to line 209 in packets.go
under function writeAuthPacket
adding
clientMultiStatements |
clientMultiResults |
调用方式 db.Query("call proc_xxx();")
golang 中的 类型判断
var a interface{} a=12 newA,ok:=a.(string) 如果ok 是 true 则说明 变量a 是字符串类型,而newA就是string类型的变量,a的实际值 a.(type) 返回的是 a的 类型, 注意他返回的不是一个 字符串表示 string int 这样表示a的类型 a.(type)是和switch 搭配使用的 switch vtype:=v.(type){ case string: case int: case []interface{}: default: }
json 简单的 encode decode
import "encoding/json" type MyData struct { Name string `json:"item"` Other float32 `json:"amount"` } detail:=&MyData{"Name":"hello","Other":2} userinfo, _ := json.Marshal(detail) fmt.Println(string(userinfo)) //`json:"item"` 就是Name字段在从结构体实例编码到JSON数据格式的时候,使用item作为名字。算是一种重命名的方式。 //输出:{"item":"hello","amount":2} userinfo,_:=json.Marshal(detail) ObjUser := make(map[string]interface{}) json.Unmarshal([]byte(userinfo), &ObjUser)
panic和恢复recover用法
defer func() {
if re := recover(); re != nil {
fmt.Printf("%v", re)
}
}()
从文件中json解析
尽量使用os.OpenFile直接获取reader,然后再从reader中使用Decoder来解析json
package main import ( "fmt" "encoding/json" "os") func main() { pathToFile := "jsondata.txt" file, err := os.OpenFile(pathToFile, os.O_RDONLY, 0644) if err != nil { fmt.Println(err) os.Exit(1) } configs := make(map[string]map[string][]Service, 0) err = json.NewDecoder(file).Decode(&configs) if err != nil { fmt.Println(err) os.Exit(1) }}
lock 并发小例
import ( "fmt" "sync" "time" ) var l sync.Mutex func main() { l.Lock() defer l.Unlock() m := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ch := make(chan int) defer close(ch) for i := 0; i < 30; i++ { time.Sleep(time.Second) go func(x int) { for { if len(m) == 0 { break } else { l.Unlock() fmt.Println(x, m[0:1]) m = m[1:len(m)] l.Lock() } time.Sleep(time.Second) } ch <- x }(i) } for i := 0; i < 30; i++ { fmt.Println(<-ch) } }
future 小例
package main import ( "fmt" ) //一个查询结构体 type query struct { //参数Channel sql chan string //结果Channel result chan string } //执行Query func execQuery(q query) { //启动协程 go func() { //获取输入 sql := <-q.sql //访问数据库,输出结果通道 q.result <- "get " + sql }() } func main() { //初始化Query q := query{make(chan string, 1), make(chan string, 1)} //执行Query,注意执行的时候无需准备参数 execQuery(q) //准备参数 q.sql <- "select * from table" //获取结果 fmt.Println(<-q.result) }
反射小例
package main import ( "errors" "fmt" "reflect" ) func foo() { fmt.Println("hello") } func bar(a, b, c int) { fmt.Println(a, b, c) } func Call(m map[string]interface{}, name string, params ...interface{}) (result []reflect.Value, err error) { f := reflect.ValueOf(m[name]) if len(params) != f.Type().NumIn() { err = errors.New("The number of params is not adapted.") return } in := make([]reflect.Value, len(params)) for k, param := range params { in[k] = reflect.ValueOf(param) } result = f.Call(in) return } func main() { funcs := map[string]interface{}{"foo": foo, "bar": bar} Call(funcs, "foo") Call(funcs, "bar", 1, 2, 3) }
快速搭建服务器
func main(){ http.HandleFunc( "/",Handler) http.HandleFunc( "/valueget",valueget) s := &http.Server{ Addr: ":80", ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe()) }func valueget(w http.ResponseWriter, r
*
http.Request) {
params :
=
r.URL.Query()
user :
=
params.Get(
"user"
)
fmt.Fprintf(w,
"you are get user %s"
, user)
}
go “静态目录服务” http.FileServer
//对目录提供静态映射服务
http.Handle("/", http.FileServer(http.Dir("/tmp")))
http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
go语言中导入另外一个库结果调用时出错:cannot refer to unexported name
解决方法
go,模块中要导出的函数,必须首字母大写。
goto
func main() { defer fmt.Println("cc") goto L defer fmt.Println("dd") fmt.Println("aa") L: fmt.Println("bb") } 输出 bb cc
git 安装redis
cd $GOPATH/src git clone git://github.com/alphazero/Go-Redis.git redis cd redis go install
hook
package main import ( "fmt" ) var hooks []hookfunc //hook function slice to store the hookfunc type hookfunc func() error //hook function to run func initOne() error { fmt.Println("hello world 1") return nil } func initTwo() error { fmt.Println("hello world 2") return nil } func AddHook(hf hookfunc) { hooks = append(hooks, hf) } func main() { AddHook(initOne) AddHook(initTwo) // do hooks function for _, hk := range hooks { err := hk() if err != nil { panic(err) } } }
signalpackage main
import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { go signalHandle() time.Sleep(time.Second * 50) } func signalHandle() { for { ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGHUP) sig := <-ch switch sig { default: fmt.Println("default") case syscall.SIGHUP: fmt.Println("SIGHUP") case syscall.SIGINT: fmt.Println("SIGINT") case syscall.SIGUSR1: fmt.Println("SIGUSR1") case syscall.SIGUSR2: fmt.Println("SIGUSR2") } } }
闭包
package main import "fmt" func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) } }
json 解析标签
//tag中的第一个参数是用来指定别名 //比如Name 指定别名为 username `json:"username"` //如果不想指定别名但是想指定其他参数用逗号来分隔 //omitempty 指定到一个field时 如果该字段为nil或0值(数字0,字符串"",空数组[]等),则打包的JSON结果不会有这个字段//- 指定到一个field时 无论有没有值将Person序列化成json时都会忽略该字段 //string 指定到一个field时 //比如Person中的Count为int类型 如果没有任何指定在序列化 //到json之后也是int 比如这个样子 "Count":0 //但是如果指定了string之后序列化之后也是string类型的 //那么就是这个样子"Count":"0" type Person struct { Name string `json:"username"` Age int Gender bool `json:",omitempty"` Profile string OmitContent string `json:"-"` Count int `json:",string"` }
命令
格式化(美化)文件代码 >go fmt -x test 或者 >gofmt -l -w E:projectsgosrc estmain.go