json序列化

内存中变成可存储或传输的过程称之为序列化(dict,split,struct转string)

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. type Stu struct {
  9. Name string
  10. Age int
  11. }
  12.  
  13. func JsonDump() (ret string, err error) {
  14. stu1 := Stu{
  15. Name: "somebody",
  16. Age: 20,
  17. }
  18. data, err := json.Marshal(stu1)
  19. if err != nil {
  20. err = fmt.Errorf("json dump failed:", err)
  21. return
  22. }
  23. ret = string(data)
  24. fmt.Println(ret)
  25. return
  26. }
  27.  
  28. func main() {
  29. JsonDump()
  30. }

  

json反序列化

磁盘读取到内存

需要先定义一个存储的数据类型(map struct),string要转成byte

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. type Stu struct {
  9. Name string
  10. Age int
  11. }
  12.  
  13. func JsonDump() (ret string, err error) {
  14. stu1 := Stu{
  15. Name: "somebody",
  16. Age: 20,
  17. }
  18. data, err := json.Marshal(stu1)
  19. if err != nil {
  20. err = fmt.Errorf("json dump failed:", err)
  21. return
  22. }
  23. ret = string(data)
  24. return
  25. }
  26.  
  27. func JsonLoad(res string) (ret interface{}, err error) {
  28. var stu Stu
  29. err = json.Unmarshal([]byte(res), &stu)
  30. if err != nil {
  31. err = fmt.Errorf("json loads failed:", err)
  32. return
  33. }
  34. ret = stu
  35. return
  36. }
  37.  
  38. func main() {
  39. response, _ := JsonDump()
  40. res, _ := JsonLoad(response)
  41. fmt.Println(res)
  42. }

  

命令行参数的解析

flag模块

  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. )
  7.  
  8. func main() {
  9. var confPath string
  10. var command string
  11. var port int
  12.  
  13. flag.StringVar(&confPath, "c", "conf", "conf file of app")//变量名  -c 默认值  描述
  14. flag.StringVar(&command, "a", "online", "command to execute")
  15. flag.IntVar(&port, "p", 10000, "port of service")
  16. flag.Parse()
  17.  
  18. fmt.Println(confPath)
  19. fmt.Println(command)
  20. fmt.Println(port)
  21. }

  

slice取随机数

  1. var indexList []int
  2. for i := 0; i < chooseNum; i++ {
  3. //避免随机出现重复
  4. for {
  5. randIndex := rand.Intn(len(totalList))
  6. flag := true
  7. for _, v := range indexList {
  8. if v == randIndex {
  9. flag = false
  10. }
  11. }
  12. if flag {
  13. indexList = append(indexList, randIndex)
  14. break
  15. }
  16. }
  17. }

  

远程登录执行ssh命令(支持密码、秘钥)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "io/ioutil"
  6. "net"
  7. "os"
  8. "time"
  9.  
  10. "golang.org/x/crypto/ssh"
  11. )
  12.  
  13. func connect(user, password, host, key string, port int) (*ssh.Session, error) {
  14. var (
  15. auth []ssh.AuthMethod
  16. addr string
  17. clientConfig *ssh.ClientConfig
  18. client *ssh.Client
  19. session *ssh.Session
  20. err error
  21. )
  22. // get auth method
  23. auth = make([]ssh.AuthMethod, 0)
  24. if key == "" {
  25. auth = append(auth, ssh.Password(password))
  26. } else {
  27. pemBytes, err := ioutil.ReadFile(key)
  28. if err != nil {
  29. return nil, err
  30. }
  31. var singer ssh.Signer
  32. if password == "" {
  33. singer, err = ssh.ParsePrivateKey(pemBytes)
  34. } else {
  35. singer, err = ssh.ParsePrivateKeyWithPassphrase(pemBytes, []byte(password))
  36. }
  37.  
  38. if err != nil {
  39. return nil, err
  40. }
  41. auth = append(auth, ssh.PublicKeys(singer))
  42. }
  43.  
  44. clientConfig = &ssh.ClientConfig{
  45. User: user,
  46. Auth: auth,
  47. Timeout: 3 * time.Second,
  48. HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
  49. return nil
  50. },
  51. }
  52.  
  53. // connet to ssh
  54. addr = fmt.Sprintf("%s:%d", host, port)
  55.  
  56. if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
  57. return nil, err
  58. }
  59.  
  60. // create session
  61. if session, err = client.NewSession(); err != nil {
  62. return nil, err
  63. }
  64.  
  65. return session, nil
  66. }
  67.  
  68. func main() {
  69. session, err := connect("admin", "", "172.20.165.161", "/home/admin/id_rsa", 22)
  70. if err != nil {
  71. fmt.Println(err)
  72. }
  73. defer session.Close()
  74.  
  75. session.Stdout = os.Stdout
  76. session.Stderr = os.Stderr
  77. session.Run("sh /export/Packages/merger_server_ab/latest/bin/stop.sh")
  78. }

  

调用shell命令

阻塞方式(需要执行结果)

  1. //阻塞式的执行外部shell命令的函数,等待执行完毕并返回标准输出
  2. func exec_shell(s string) (string, error){
  3. //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序
  4. cmd := exec.Command("/bin/bash", "-c", s)
  5.  
  6. //读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
  7. var out bytes.Buffer
  8. cmd.Stdout = &out
  9.  
  10. //Run执行c包含的命令,并阻塞直到完成。 这里stdout被取出,cmd.Wait()无法正确获取stdin,stdout,stderr,则阻塞在那了
  11. err := cmd.Run()
  12. checkErr(err)
  13.  
  14. return out.String(), err
  15. }

  

shell标准输出逐行实时处理

  1. func execCommand(commandName string, params []string) bool {
  2. //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序
  3. cmd := exec.Command("/bin/bash","-c",command)
  4.  
  5. //显示运行的命令
  6. fmt.Println(cmd.Args)
  7. //StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道。Wait方法获知命令结束后会关闭这个管道,一般不需要显式的关闭该管道。
  8. stdout, err := cmd.StdoutPipe()
  9.  
  10. if err != nil {
  11. fmt.Println(err)
  12. return false
  13. }
  14.  
  15. cmd.Start()
  16. //创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
  17. reader := bufio.NewReader(stdout)
  18.  
  19. //实时循环读取输出流中的一行内容
  20. for {
  21. line, err2 := reader.ReadString('\n')
  22. if err2 != nil || io.EOF == err2 {
  23. break
  24. }
  25. fmt.Println(line)
  26. }
  27.  
  28. //阻塞直到该命令执行完成,该命令必须是被Start方法开始执行的
  29. cmd.Wait()
  30. return true
  31. }

  

文件处理

读文件

  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. )
  9.  
  10. func main() {
  11. inputFile, err := os.Open("ip.txt")
  12. if err != nil {
  13. err = errors.New("open file error")
  14. fmt.Println(err)
  15. return
  16. }
  17. defer inputFile.Close()
  18. fd, err := ioutil.ReadAll(inputFile)
  19. fmt.Println(string(fd))
  20. }

  

写文件

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8.  
  9. func main() {
  10. outputFile, outputError := os.OpenFile("ip.txt", os.O_WRONLY|os.O_CREATE, 0666)
  11. if outputError != nil {
  12. fmt.Println(outputError)
  13. return
  14. }
  15. defer outputFile.Close()
  16. outputWriter := bufio.NewWriter(outputFile)
  17. outputString := "3.3.3.3\n"
  18. for i := 0; i < 10000; i++ {
  19. outputWriter.WriteString(outputString)
  20. }
  21. outputWriter.Flush()
  22. }

  

recover

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func tryRecover() {
  8. defer func() {
  9. r := recover()
  10. if err, ok := r.(error); ok {
  11. fmt.Println("error occurred:", err)
  12. } else {
  13. panic(r)
  14. }
  15. }()
  16. a := 5
  17. b := 0
  18. c := a / b
  19. fmt.Println(c)
  20. }
  21.  
  22. func main() {
  23. tryRecover()
  24. }

  

go杂货铺的更多相关文章

  1. 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

    算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比 ...

  2. Pyhton开发【第五篇】:Python基础之杂货铺

    Python开发[第五篇]:Python基础之杂货铺   字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进 ...

  3. python 杂货铺

    python 杂货铺之不知道的python操作 1.交互模式下的神奇的_ windos中cmd交互模式中下(python2,python3),最近一个表达式的值赋给变量 _.这样我们就可以把它当作一个 ...

  4. (ZT)算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

    https://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html 0.写在前面的话 我个人一直很喜欢算 ...

  5. Python特技杂货铺

    Python3特技杂货铺 Python3实现汉字简体和繁体相互转换 Python3中通过fake_useragent生成随机UserAgent 修改线上配置文件 PyCharm中项目上传到GitHub ...

  6. 【python】-- 基于Django的杂货铺

    Django的杂货铺 此篇文章保存基于Django而实现的各种小功能示例 1.验证码 + Session 这个是在前端图片验证码的生成,再配合Session进行后端校验的功能示例 import ran ...

  7. uvm_misc——杂货铺(miscellaneous)

    uvm_misc 是个很有意思的文件夹,本质上就是个UVM的杂货铺,包含一些很重要的class, task, function, 但不知道给归类到哪儿,所以,uvm_misc就很好地承担了这个任务,几 ...

  8. 【转】算法杂货铺——k均值聚类(K-means)

    k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...

  9. Python学习【第十篇】基础之杂货铺

    字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 百分号方式: ...

  10. Python开发【杂货铺】:模块logging

    logging模块 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式 ...

随机推荐

  1. JS中闭包的介绍

    闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascri ...

  2. PATA 1036. Boys vs Girls (25)

    https://www.patest.cn/contests/pat-a-practise/1036 #include <bits/stdc++.h> using namespace st ...

  3. ES6_05_三点运算符和形参默认值

    三点运算符的用途: # 1. rest(可变)参数 * 用来取代arguments 但比 arguments 灵活,只能是最后部分形参参数 function fun(...values) { cons ...

  4. 看看大神 Paul Graham 对如何学习编程的回答

    前言 我翻阅自己之前写的博客文章,发现在 2015 年我刚开始学习编程的时候,翻译了一段 Paul Graham 关于"How can I learn to program?"的回 ...

  5. C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerable

    C# 8.0中,提供了一种新的IAsyncEnumerable<T>接口,在对集合进行迭代时,支持异步操作.比如在读取文本中的多行字符串时,如果读取每行字符串的时候使用同步方法,那么会导致 ...

  6. 控制台程序秒变Windows服务(Topshelf)

    项目中有些时候需要写服务,一般我们都是先创建控制台程序,测试,运行,成功之后再创建windows服务程序,这样好麻烦啊,有没有简单的控制台程序直接变成Widnows服务,经过查找,找到了Topshel ...

  7. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  8. CDQZ集训DAY2 日记

    依然很爆炸. T1上来有50分暴力分,打完后注意到了后50分的随机数据,开始想怎么去对付他.然后就开始思考随机数据意味着什么.想了想,想打一个扫描线或者分治.决策了一下还是打了一个扫描线+链表.然而只 ...

  9. 学习2:总结# 1.while # 2.字符串格式化 # 3.运算符 # 4.编码初始

    目录 1.while循环 -- 死循环 2.字符串格式化: 3.运算符 4.编码 1.while循环 -- 死循环 while 条件: 循环体 打断死循环: break -- 终止当前循环 改变条件 ...

  10. Java编程思想:擦除的补偿(数组泛型处,我有很多细节没有研究)

    import sun.net.www.content.text.Generic; import java.lang.reflect.Array; import java.util.ArrayList; ...