zoukankan      html  css  js  c++  java
  • go杂货铺

    json序列化

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

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Stu struct {
    	Name string
    	Age  int
    }
    
    func JsonDump() (ret string, err error) {
    	stu1 := Stu{
    		Name: "somebody",
    		Age:  20,
    	}
    	data, err := json.Marshal(stu1)
    	if err != nil {
    		err = fmt.Errorf("json dump failed:", err)
    		return
    	}
    	ret = string(data)
    	fmt.Println(ret)
    	return
    }
    
    func main() {
    	JsonDump()
    }
    

      

    json反序列化

    磁盘读取到内存

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

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Stu struct {
    	Name string
    	Age  int
    }
    
    func JsonDump() (ret string, err error) {
    	stu1 := Stu{
    		Name: "somebody",
    		Age:  20,
    	}
    	data, err := json.Marshal(stu1)
    	if err != nil {
    		err = fmt.Errorf("json dump failed:", err)
    		return
    	}
    	ret = string(data)
    	return
    }
    
    func JsonLoad(res string) (ret interface{}, err error) {
    	var stu Stu
    	err = json.Unmarshal([]byte(res), &stu)
    	if err != nil {
    		err = fmt.Errorf("json loads failed:", err)
    		return
    	}
    	ret = stu
    	return
    }
    
    func main() {
    	response, _ := JsonDump()
    	res, _ := JsonLoad(response)
    	fmt.Println(res)
    }
    

      

    命令行参数的解析

    flag模块

    package main
    
    import (
    	"flag"
    	"fmt"
    )
    
    func main() {
    	var confPath string
    	var command string
    	var port int
    
    	flag.StringVar(&confPath, "c", "conf", "conf file of app")//变量名  -c   默认值  描述
    	flag.StringVar(&command, "a", "online", "command to execute")
    	flag.IntVar(&port, "p", 10000, "port of service")
    	flag.Parse()
    
    	fmt.Println(confPath)
    	fmt.Println(command)
    	fmt.Println(port)
    }
    

      

    slice取随机数

    	var indexList []int
    	for i := 0; i < chooseNum; i++ {
    		//避免随机出现重复
    		for {
    			randIndex := rand.Intn(len(totalList))
    			flag := true
    			for _, v := range indexList {
    				if v == randIndex {
    					flag = false
    				}
    			}
    			if flag {
    				indexList = append(indexList, randIndex)
    				break
    			}
    		}
    	}
    

      

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

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"net"
    	"os"
    	"time"
    
    	"golang.org/x/crypto/ssh"
    )
    
    func connect(user, password, host, key string, port int) (*ssh.Session, error) {
    	var (
    		auth         []ssh.AuthMethod
    		addr         string
    		clientConfig *ssh.ClientConfig
    		client       *ssh.Client
    		session      *ssh.Session
    		err          error
    	)
    	// get auth method
    	auth = make([]ssh.AuthMethod, 0)
    	if key == "" {
    		auth = append(auth, ssh.Password(password))
    	} else {
    		pemBytes, err := ioutil.ReadFile(key)
    		if err != nil {
    			return nil, err
    		}
    		var singer ssh.Signer
    		if password == "" {
    			singer, err = ssh.ParsePrivateKey(pemBytes)
    		} else {
    			singer, err = ssh.ParsePrivateKeyWithPassphrase(pemBytes, []byte(password))
    		}
    
    		if err != nil {
    			return nil, err
    		}
    		auth = append(auth, ssh.PublicKeys(singer))
    	}
    
    	clientConfig = &ssh.ClientConfig{
    		User:    user,
    		Auth:    auth,
    		Timeout: 3 * time.Second,
    		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
    			return nil
    		},
    	}
    
    	// connet to ssh
    	addr = fmt.Sprintf("%s:%d", host, port)
    
    	if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
    		return nil, err
    	}
    
    	// create session
    	if session, err = client.NewSession(); err != nil {
    		return nil, err
    	}
    
    	return session, nil
    }
    
    func main() {
    	session, err := connect("admin", "", "172.20.165.161", "/home/admin/id_rsa", 22)
    	if err != nil {
    		fmt.Println(err)
    	}
    	defer session.Close()
    
    	session.Stdout = os.Stdout
    	session.Stderr = os.Stderr
    	session.Run("sh /export/Packages/merger_server_ab/latest/bin/stop.sh")
    }
    

      

    调用shell命令

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

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

      

    shell标准输出逐行实时处理

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

      

     文件处理

    读文件

    package main
    
    import (
    	"errors"
    	"fmt"
    	"io/ioutil"
    	"os"
    )
    
    func main() {
    	inputFile, err := os.Open("ip.txt")
    	if err != nil {
    		err = errors.New("open file error")
    		fmt.Println(err)
    		return
    	}
    	defer inputFile.Close()
    	fd, err := ioutil.ReadAll(inputFile)
    	fmt.Println(string(fd))
    }
    

      

    写文件

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"os"
    )
    
    func main() {
    	outputFile, outputError := os.OpenFile("ip.txt", os.O_WRONLY|os.O_CREATE, 0666)
    	if outputError != nil {
    		fmt.Println(outputError)
    		return
    	}
    	defer outputFile.Close()
    	outputWriter := bufio.NewWriter(outputFile)
    	outputString := "3.3.3.3
    "
    	for i := 0; i < 10000; i++ {
    		outputWriter.WriteString(outputString)
    	}
    	outputWriter.Flush()
    }
    

      

    recover

    package main
    
    import (
    	"fmt"
    )
    
    func tryRecover() {
    	defer func() {
    		r := recover()
    		if err, ok := r.(error); ok {
    			fmt.Println("error occurred:", err)
    		} else {
    			panic(r)
    		}
    	}()
    	a := 5
    	b := 0
    	c := a / b
    	fmt.Println(c)
    }
    
    func main() {
    	tryRecover()
    }
    

      

  • 相关阅读:
    阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?
    阿里云学生机——Mysql配置---教小白入门篇
    关于Javac编译器的那点事(一)
    B树,B+树,B*树简介
    ArrayList动态扩容机制
    满二叉树和完全二叉树
    nginx实践(二)之静态资源web服务(浏览器缓存场景)
    http之cdn介绍
    http之理解304
    nginx实践(一)之静态资源web服务
  • 原文地址:https://www.cnblogs.com/hongpeng0209/p/9172399.html
Copyright © 2011-2022 走看看