golang 小知识点记录
获取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"][])) //发送到HTTP客户端
io.WriteString(w, "hello, world!\n") //发送到HTTP客户端
fmt.Fprintf(w, "%s", "hello, world!\n") //发送到HTTP客户端 }
获取当前路径
os.Getwd() //执行用户当前所在路径
file, _ := exec.LookPath(os.Args[])//执行程序所在的绝对路径
变量类型转换
floatTOint
int(float) intTOfloat
var a int =
var b float64 = float64(a)
stringTOfloat( / )
f, err := strconv.ParseFloat(s, )
f, err := strconv.ParseFloat(s, )
intTOstring
var i int =
str1 := strconv.Itoa(i) // 通过Itoa方法转换
str2 := fmt.Sprintf("%v", i) // 通过Sprintf方法转换 万能
stringTOint
var s string = ""
var i int
i, err = strconv.Atoi(s)
stringToint
strconv.ParseInt()
strToBool
i, err =strconv.ParseBool("")
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 =
b = a.(int32)
强制类型转换
type MyInt32 int32
func main() {
var uid int32 =
var gid MyInt32 = MyInt32(uid)
fmt.Printf("uid=%d, gid=%d\n", uid, gid)
}
强制类型转换
unsafe.Pointer string byte互转
aa:="hello world"
bb:=[]byte(aa)
cc:=string(bb)
时间篇
当前时间戳
fmt.Println(time.Now().Unix())
# 时间戳到具体显示的转化
fmt.Println(time.Unix(t, ).String()) 带纳秒的时间戳
t = time.Now().UnixNano()
基本格式化的时间表示
fmt.Println(time.Now().String())
格式化时间
fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 记忆方法:-----
# -- :: 时间戳转str格式化时间
str_time := time.Unix(, ).Format("2006-01-02 15:04:05")
fmt.Println(str_time) # -- :: str格式化时间转时间戳
the_time := time.Date(, , , , , , , time.Local)
unix_time := the_time.Unix()
fmt.Println(unix_time) # 还有一种方法,使用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)
}
#
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\n", 32) //
fmt.Printf("%v", "hello world") // hello world 直接格式化打印
fmt.Print(fmt.Sprintf("%v", "hello world")) // hello world Sprintf 返回格式化后的变量
fmt.Print(fmt.Errorf("%08b\n", 32)) //
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\n", 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{width: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!\n")
return
}
fmt.Printf("file exist!\n")
}
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 * )
} 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 :=
return func(x int) int {
sum += x
return sum
}
} func main() {
pos, neg := adder(), adder()
for i := ; i < ; i++ {
fmt.Println(
pos(i),
neg(-*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:\projects\go\src\test\main.go
golang 小知识点记录的更多相关文章
- C#小知识点记录(QQ交流群的一个小问题)Linq提取数据
请教 这里 LINQ想 找到 最后的 4条 记录 然后放在 这里这个 List Linq查找怎么写呀? 解答:写了一个小例子作为解答. namespace C_Sharp { class Progra ...
- C#小知识点记录,对象的深拷贝
在CSDN中的定义是: public static string CompareExchange( ref string location1, string value, string compara ...
- js,css小知识点记录
JS手册中提到:可以使用任意表达式作比较表达式.任何值为0.null.未定义或空字符串的表达式被解释为 false.其他任意值的表达式解释为 true.也就是说,这里会隐式的转换为布尔值. ...
- 日常css和js小知识点记录
2015-6-29 1.<meta name="viewport" content="width=device-width,user-scalable=no&quo ...
- springMVC等小知识点记录。。。持续更新
1.springMVC 项目根路径访问页面配置 <!-- 表示当访问主页时自动转发到index控制器 --> <mvc:view-controller path="/&qu ...
- iOS小知识点记录
1.创建视图的两种方法:用代码创建视图,创建XIB文件.如何决定使用哪种方法?参考法则:如果视图没有子视图,就用代码创建:如果有子视图,就通过XIB文件创建. 2.创建视图的时候,视图控制器会调用lo ...
- React Native小知识点记录
1>查看 RN 的所有历史版本: npm view react-native versions -json 2>查看 RN 的当前版本: npm view react-native ver ...
- css 设置小知识点记录
1.消除控件与控件之间的边界 /* 公共样式 用于消除控件与控件之间的边界 */ *{ margin:0; padding:0} 2.设置背景图片大小与控件大小一致 #frame_top{ min-h ...
- C# 小知识点记录
1.当计算数据有小数点时不要使用float和double类型的数据,使用这两个会计算不准确.使用decimal 2.如果使用decimal计算数据,遇到除不进的数据有很多小数点的时候,在计算结果后面接 ...
随机推荐
- hdu-1452 Happy 2004---因子和+逆元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意: 求2004^x次方的因子和mod29的值 解题思路: 首先2004 = 2 * 2 ...
- Android(java)学习笔记22:我们到底该如何处理异常?
1. 我们到底该如何处理异常? (1)原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个 ...
- cross entropy与logistic regression
维基上corss entropy的一部分 知乎上也有一个类似问题:https://www.zhihu.com/question/36307214 cross entropy有二分类和多分类的形式,分别 ...
- 学习scala trait
// 类接口,但是可以实现方法 // 作用 多重继承 trait traitA{ val tnum: Int def log(msg: String): Unit ={ println(" ...
- Android中得到布局文件对象有三种方式
Android中得到布局文件对象有三种方式 第一种,通过Activity对象 View view = Activity对象.getLayoutInflater().inflater(R.layout. ...
- o'Reill的SVG精髓(第二版)学习笔记——第九章
第九章:文本 9.1 字符:在XML文档中,字符是指带有一个数字值的一个或多个字节,数字只与Unicode标准对应. 符号:符号(glyph)是指字符的视觉呈现.每个字符都可以用很多不同的符号来呈现. ...
- SpringBoot非官方教程 | 第十九篇: 验证表单信息
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot19/ 本文出自方志朋的博客 这篇文篇主要简述如何 ...
- TIDB1 —— TiDB简介
TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性. TiDB 具备如下核心特点: 1 高度兼容 MySQL 大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB, ...
- iOS之网络请求及各类错误代码含义总结(包含AFN错误码大全)
转自http://blog.csdn.net/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...
- java 读取图片并转化为二进制字符串
本例子的目的在于测试往oracle数据库中插入blob字段 //以下代码源于:https://www.cnblogs.com/ywlx/p/4544179.html public static Str ...