Go从初学到精通遇到的问题汇总

1 下载依赖包问题
    cannot find package "github.com/gocql/gocql" in any of:
/usr/local/src/go/src/github.com/gocql/gocql (from $GOROOT)
($GOPATH not set)
   
   解决方式;
   1. 设置GOROOT、GOPATH
      GOPATH用来存在下载第三方的依赖包。 
      go build会从GOROOT和GOPATH中寻找依赖包
      如:
     export GOROOT=/usr/local/src/go
     export PATH=$PATH:$GOROOT/bin 
     export GOPATH=/Users/Test/gopath/go_workspace
  2 下载依赖包
     go get github.com/gocql/gocql


2 IDEA
  2.1 intellij idea 14 使用go插件
      http://blog.csdn.net/zhouzme/article/details/44133507
3 字节与字符区别
   golang采用utf-8编码存储。一个中文可以采用3个字节或者4个字节存储。如果采用字符表示,则用rune表示。 []byte表示字节数组,[]rune表示字符数组。


4 采用代理下载项目的依赖包
   http_proxy=hx.gy:1080 go get -d -v google.golang.org/grpc
   hx,gy 代理支持的域名
android.com
bitbucket.org
bintray.com
chromium.org
clojars.org
registry.cordova.io
dartlang.org
download.eclipse.org
github.com
githubusercontent.com
golang.org
googlesource.com
storage.googleapis.com
code.google.com
dl.google.com
dl-ssl.google.com
getcomposer.org
gradle.org
gopkg.in
ionicframework.com
plugins.jetbrains.com
macports.org
maven.org
melpa.org
mendeley.com
www.nuget.org
npmjs.com
npmjs.org
pypi.python.org
packagist.org
packagecontrol.io
rubygems.org
repo.typesafe.com
5 gopm 代替go 下载第三方依赖包
  在国内采用go get有时会下载不到一些网站如golang.org的依赖包。
 可以采用gopm从golang.org一些镜像网站上下载。
  1) 安装gopm
        go get -u github.com/gpmgo/gopm
       执行该命令的用户需要设置GOPATH参数
   2)gopm get 如果不携带-g采用,会把依赖包下载.vendor目录下面。
       采用-g 参数,可以把依赖包下载到GOPATH目录中
       gopm get -g golang.org/x/net  


5 defer 执行过程
defer是在return之前执行的。这个在 官方文档中是明确说明了的。要使用defer时不踩坑,最重要的一点就是要明白,return xxx这一条语句并不是一条原子指令!


函数返回的过程是这样的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数


6 包初始化顺序


   若包p导入了包q,则包q的init函数会在包p的任何函数运行前执行。


    即函数main.main()会在所有的init()函数结束后运行


7 channel


   分为缓冲channel和无缓冲channel,对于无缓冲channel,则channel的接受发生再 channel的发送完成之前。


   即go 协程发送信息时,一直阻塞到其它协程接受了信息为止。




8 go运行时 协程的调度


   当因某一协程阻塞导致物理线程阻塞时,go 运行时会把其它协程分配到其它物理线程上执行。


9 方法 传递值和传递指针


   传递值,是某个对象(各个属性值)的copy,方法不会改变实参的属性值。


   传递指针,方法可以改变实参的属性值。


10 goroutine


    在同一个原生线程里,如果当前goroutine不发生阻塞,其不会让出cpu供该线程的其它gorountine执行。


    如果goroutine发生阻塞,go 自动会把其它与该goroutine处于同一线程的goroutine分配到其它线程执行。


11 golang的值、引用和指针


    原始类型和自定义类型作为函数的参数时,都是值传递。 因此当自定义类型作为参数传递给函数时,实际参数的值不会改变。


   (Java自定义对象均是引用类型)。


    golang中得map、数组、channel是引用类型。


12 golang的工程结构
     工程名

                --包1

                    ---1.go

                --包2

                    --2.go

                main.go

 本工程内的包引入,采用相对路径方式

          如  import "工程名/包名" 在原文件中,如果某一个变量或者方法不属于某一个类,则属于该包。 导入该包,就可以使用该方法

          该工程需要在$GOPATH/src目录下面 (建议GOPATH的第一个目录)


13 golang的代码组织单位为包

    包由其导出的类型和函数组成部分(Java以类为单位,Java导入也可以具体到类)

    golang包import只能到包,可以引用包到处的类型或者函数。


14 GOROOT和GOPATH区别

GOROOT是go的安装目录,

GOPATH下载第三方的依赖包和本地开发项目

http://www.jianshu.com/p/4e699ff478a5

GO安装和常见命令

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.1.md


15 go get

使用命令go get可以下载一个单一的包或者用...下载整个子目录里面的每个包



你可能感兴趣的:(Go从初学到精通遇到的问题汇总)