zoukankan      html  css  js  c++  java
  • 零基础GO入门笔记

    1. GoLand是一个比较好用的IDE,但只免费试用30天,也可用免费的vscode,简单代码可直接使用notepad+,甚至vim;
    2. 使用GoLand的“Attach project”功能可类似Eclipse那样同时多个项目;
    3. 建议直接从1.13或更高版本开始,最低也应当从1.11版本开始,因为go包依赖管理工具“go mod”是1.11版本引入的,而新的代理设置方式是1.13版本引入的;
    4. 建议使用go mod”方式编译,而不是依赖环境变量GOPATH的编译方式,后者约束多;
    5. GO的源代码文件后缀为“.go”;
    6. 每一个源码文件均要有包名,即需要package这一行;
    7. main函数所在包名只能为main
    8. 如果main包有多少个文件,则编译时需指定全部,但不用指定其它包的文件,如:

    go build -o helloworld main.go hello.go world.go

     

    1. GO中没有继承,只有包含关系;
    2. 包名可不同于所在目录名;
    3. 同一目录下不能有不同包名(没编译到的除外);
    4. 同名包,可使用包别名特性解决(比如两个第三方库存在同名包);
    5. 同一包(名相同)不能存在多个目录下(因为import针对的是目录,多个时有import包重复声明问题);
    6. 在一个go源码文件中,一个包只能有一个import,否则存在包重复声明问题;
    7. 定义的变量名能和被引用的包名相同;
    8. 变量、函数名、结构体等,如果以小写字母打头只能同一包内使用,以大写打头则可被其它包使用,可理解为小写打头的为包私有的,而大写打头是共有的;
    9. 结构体变量可以“{}”方式初始化;
    10. GOPATH编译方式有目录结构约束,比如需有src目录;
    11. “go mod”方式编译没有目录结构约束,但注意须在项目根目录下执行“go mod init <模块名>”以生成文件“go.mod”;
    12. “go mod”方式的import要带上模块名,然后才是目录名,没有包含包名,如:

    1) import "test/hello"中的test为模块名,hello为包文件所在叶子目录名(不是包名);

    2) import "test/exam/hello"中的test为模块名,exam为父目录名,hello为叶子目录名

     

    1. “go get”下载拉取的文件被房子GOPATH目录下,如果没有设置环境变量GOPATH,则执行“go env|grep GOPATH”可查看的GOPATH值,否则以环境变量GOPATH为准;
    2. “go get”不可用时,可以手工下载包;
    3. 当网络墙原因“go get”不可用时,可考虑使用七牛云的代理goproxy.cn或者goproxy.io,但通常goproxy.cn更好用;
    4. “go get”设置代理方式(1.13及以上版本):

    go env -w GOPROXY=https://goproxy.cn,direct

    默认可能是“GOPROXY="https://proxy.golang.org,direct"”,可执行“go env|grep GOPROXY”确认。

    1. 手工下载的包,可在go.mod文件中指定,注意一个包同时需要有require和replace,如:

    require google.golang.org/grpc v1.27.1 // indirect

    replace google.golang.org/grpc => /usr/local/go/src/google.golang.org/grpc

    1. 可把命令go看作gcc,使用Makefile组织管理编译;
    2. 接口interface变量一般定义为对象,结构体struct变量一般定义为指针;
    3. 一个结构体只要实现了接口的所以方法,即为对接口的实现,不需像C++或JAVA那样显示指定,也不能显示指定,这是语法规定(缺点是不方便查找一个接口有哪些实现,一个结构体实现了哪些接口);
    4. JSON字符串可以直接反射为结构体,反过来也可以;
    5. GO中的string不像C++中std::string,并不支持二进制数据,二进制数据要使用byte类型;
    6. 可调用runtime.GOMAXPROCS设置进程最多占用的cpu核数;
    7. 可调用runtime.NumCPU得到cpu核数;
    8. 可调用debug.SetMaxThreads设置进程最多启动的线程数;
    9. 线程对程序是透明的,程序看到的是协程;
    10. go并不直接支持fork调用,但有os.Exec这样的调用;
    11. 不支持C和C++那样的隐式类型转换,即使是整数类型间转换也需显示指定;
    12. “:=”方式声明变量,需保证至少包含一个新变量。

    附:易遇编译错误

    1) missing dot in first path element

    如下错误可能是需要先到上一级目录先编译一次:

    build command-line-arguments:

    cannot load test/hello:

    malformed module path "test/hello": missing dot in first path element

    也有可能是import问题,比如下面这样:

    import (

      "fmt"

      myproto "proto"

    )

    import (

      "test/proto"

    )

    得把myproto那一行删除。

    2) but does not contain package

    build command-line-arguments:

    cannot load github.com/go-redis/redis/v7:

    module github.com/go-redis/redis/v7@latest found (v7.2.0),

    but does not contain package github.com/go-redis/redis/v7

    这个可能是因为没有目录的可执行和文件的读取权限,比如go-redis的属主是root,而使用的是非root,解决办法是为目录增加可执行权限和文件增加可读权限。

    3) go.mod: no such file or directory

    go: google.golang.org/grpc@v1.27.1:

    parsing /usr/local/go/src/google.golang.org/grpc/go.mod:

    open /usr/local/go/src/google.golang.org/grpc/go.mod: no such file or directory

    遇到这个错误时,可尝试将go.mod文件删除后重执行“go mod init”操作,然后再执行“go build”编译。执行“go build”有个提前,即要能拉取(go get)互联网上的依赖的包。

  • 相关阅读:
    RFID基础知识
    iOS开发技巧:使用ObjectiveC创建UUID的代码
    Java获取当前路径
    Oracle 10g 一些事项
    windows 2003 下IIS没有ASP.NET 1.1.4322选项卡
    Windows下手动完全卸载Oracle
    C#如何检测网络端口连接的状态
    windows 2003 下oracle从10.2.0.1升级到10.2.0.4
    Oracle 获取当前日期及日期格式
    Retrieving COM for CLSID {0002450000000000C000000000000046} 80040154.
  • 原文地址:https://www.cnblogs.com/aquester/p/12390914.html
Copyright © 2011-2022 走看看