zoukankan      html  css  js  c++  java
  • go的常见操作

    go的开发环境搭建:https://www.cnblogs.com/wqzn/p/11730052.html

    GOROOT和GOPATH

    GOROOTGOPATH都是环境变量,

    • 其中GOROOT是我们安装go开发包的路径,
    • GOPATH是存放go的代码目录,

    从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH设置一个默认目录,参见下表。

    GOPATH在不同操作系统平台上的默认值

    平台GOPATH默认值举例
    Windows %USERPROFILE%/go C:Users用户名go
    Unix $HOME/go /home/用户名/go

    我们只需要记住默认的GOPATH路径在哪里就可以了。

    我们需要将 GOROOT下的bin目录及GOPATH下的bin目录都添加到环境变量中。

    配置环境变量之后需要重启你电脑上已经打开的终端。(例如cmd、VS Code里面的终端和其他编辑器的终端)。

    VSCode:

    安装Go语言开发工具包

    在座Go语言开发的时候为我们提供诸如代码提示、代码自动补全等功能。

    Windows平台按下Ctrl+Shift+P,Mac平台按Command+Shift+P,这个时候VS Code界面会弹出一个输入框,如下图:

     设置好翻墙代理:

    go.toolsGopath setting is not set. Using GOPATH D:gospace
    Installing 17 tools at D:gospacein in module mode.
      gocode
      gopkgs
      go-outline
      go-symbols
      guru
      gorename
      gotests
      gomodifytags
      impl
      fillstruct
      goplay
      godoctor
      dlv
      gocode-gomod
      godef
      goreturns
      golint
    
    Installing github.com/fatih/gomodifytags SUCCEEDED
    Installing golang.org/x/tools/cmd/gorename SUCCEEDED
    Installing github.com/josharian/impl SUCCEEDED
    Installing golang.org/x/tools/cmd/guru SUCCEEDED
    Installing github.com/mdempsky/gocode SUCCEEDED
    Installing golang.org/x/tools/cmd/gorename SUCCEEDED
    Installing github.com/uudashr/gopkgs/v2/cmd/gopkgs SUCCEEDED
    Installing github.com/cweill/gotests/... SUCCEEDED
    Installing github.com/fatih/gomodifytags SUCCEEDED
    Installing github.com/cweill/gotests/... SUCCEEDED
    Installing github.com/fatih/gomodifytags SUCCEEDED
    Installing github.com/ramya-rao-a/go-outline SUCCEEDED
    Installing github.com/josharian/impl SUCCEEDED
    Installing github.com/josharian/impl SUCCEEDED
    Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
    Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
    Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
    Installing github.com/acroca/go-symbols SUCCEEDED
    Installing golang.org/x/tools/cmd/guru SUCCEEDED
    Installing golang.org/x/tools/cmd/gorename SUCCEEDED
    Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
    Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
    Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
    Installing github.com/cweill/gotests/... SUCCEEDED
    Installing github.com/fatih/gomodifytags SUCCEEDED
    Installing github.com/josharian/impl SUCCEEDED
    Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
    Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
    Installing github.com/godoctor/godoctor SUCCEEDED
    Installing github.com/godoctor/godoctor SUCCEEDED
    Installing github.com/godoctor/godoctor SUCCEEDED
    Installing github.com/godoctor/godoctor SUCCEEDED

    一、file

    1、go 判断文件/目录是否存在、区分文件和目录

    // IsExist checks whether a file or directory exists.
    // It returns false when the file or directory does not exist.
    func IsExist(f string) bool {
        _, err := os.Stat(f)
        return err == nil || os.IsExist(err)
    }
    
    // IsFile checks whether the path is a file,
    // it returns false when it's a directory or does not exist.
    func IsFile(f string) bool {
        fi, e := os.Stat(f)
        if e != nil {
            return false
        }
        return !fi.IsDir()
    }

    二、日志:

    0.打印日志

    log.Println("---------------load config-------------------")
    1. 直接退出
    1. 引发异常,并退出
      这个 panic 可以类比 python 中的 raise、java 中的 throw, 这样抛出的异常是一个堆栈信息,能够追溯代码错误的位置,这个在使用时我用着更顺手

    恢复 panic 引发的异常使用 recover

    func main(){
        var s sync.WaitGroup
        for i:=0;i<10;i++{
            s.Add(1)
            go func(i int){
                defer func(){
                    if err := recover();err!=nil{
                        log.Println("this is error",err)
                    }
                    s.Done()
                    log.Println(i,"is over")
                }()
                log.Panic(i,"i want panic")
            }(i)
        }
        s.Wait()
    }

    但是需要注意,recover 之后并不会打印 panic 的堆栈信息。

     三、序列化

    示例

    {
        "time_out": 20,
        "user_groups": [
            {
                "server": "192.168.1.2",
                "name": "myown",
                "port": 1234,
                "password": "1234567",
                "cipher": "AEAD_CHACHA20_POLY1305",
                "time_out": 10
            }
        ]
    }

    代码

    package main
    
    import(
        "io/ioutil"
        "encoding/json"
        "fmt"
        "time"
    )
    
    type UserGroup struct{
        Name string `json:"name"`
        Server    string `json:"server"`
        Port int    `json:"port"`
        Password  string `json:"password"`
        Cipher    string `json:"cipher"`
        Key       string `json:"key"`
        Keygen    int    `json:"key_gen"`
        UDPTimeout    time.Duration  `json:"time_out"`
    }
    
    type Config struct {
        UserGroups []*UserGroup `json:"user_groups"`
        UDPTimeout time.Duration `json:"time_out"`
    }
    
    
    /**
     * @msg: 读取json 文件数据,按照参数 v 的格式解析
     * @param: fileName
     * @return: 
     */
    func LoadJsonData(fileName string, v interface{}) error{
        data, err := ioutil.ReadFile(fileName)
        if err != nil{
            return err;
        }
    
        dataJson := []byte(data)
    
        if err = json.Unmarshal(dataJson, v); err != nil{
            return err
        }
        return nil
    }
    
    
    func main(){
        /**
         * 异常捕获
         */
        defer func() {
            if err := recover(); err != nil{
                fmt.Println("发生异常:",err)
            }
        }()
        var MConfig = &Config{}
        if err := LoadJsonData("config.json", MConfig); err != nil{
            fmt.Println("读取配置错误")
            panic(err)
        }
        fmt.Println("获取到的数据为:", *MConfig.UserGroups[0])
    }

     还有比较好的例子https://blog.csdn.net/x356982611/article/details/80493296

  • 相关阅读:
    英文文法学习笔记(14)分词
    利用别名简化进入docker容器数据库的操作
    英文文法学习笔记(12)形容词
    小知识:在Exadata平台上使用ExaWatcher收集信息
    小知识:调整OCI实例的时区
    小知识:Docker环境缺少vi命令,如何解决
    小知识:Exadata平台去掉密码输错延迟10分钟登录
    英文文法学习笔记(13)副词
    SpringBoot,SpringMvc 参数校验 用法详解
    java 获取项目根路径、获取桌面路径
  • 原文地址:https://www.cnblogs.com/duanxz/p/12526712.html
Copyright © 2011-2022 走看看