在mac下,使用brew install go进行安装。另外,我们知道从 Go 1.11 版本开始,官方支持了 go module 包依赖管理工具(参见 https://www.cnblogs.com/sage-blog/p/10640947.html),并新增了 GOPROXY 环境变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY 代理服务。同时,也提供了公用的代理服务 https://goproxy.io,我们只需设置该环境变量即可正常下载被墙的源码包了:
# 启用 Go Modules 功能
export GO111MODULE=on
# 配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io
参见 https://github.com/gopherdata/gophernotes,在mac下的安装命令为
env GO111MODULE=on go get github.com/gopherdata/gophernotes
mkdir -p ~/Library/Jupyter/kernels/gophernotes
cd ~/Library/Jupyter/kernels/gophernotes
cp "$(go env GOPATH)"/pkg/mod/github.com/gopherdata/[email protected]/kernel/* "."
chmod +w ./kernel.json # in case copied kernel.json has no write permission
sed "s|gophernotes|$(go env GOPATH)/bin/gophernotes|" < kernel.json.in > kernel.json
安装好之后,打开jupyter notebook就能看到新增了go内核啦。
和python一样,Go是讲究书写格式的,函数的第一个{一定要和函数体在一起。有如下几个包可以控制格式
使用go get安装github上的包。-D表示仅下载不安装。使用go install将src里面的源文件安装到$GOBIN文件夹下。
源文件使用go build编译、go run运行。也可以直接go run XX.go运行,不要太方便。
Go是静态语言,数据类型包括:bool,string,int,float32,float64, [](数组)。Go中的变量声明后,默认初始化为“零值”。注意不像python,字符串不能用单引号。如果用反引号`,则不需要做转义。
用const声明常量。
定义变量的几种方式:
var s string
var s string = "hello"
var s = "hello" // 类型推断
s := "hello" // 类型推断+去掉var的简写,只能在函数内使用。
使用块表明作用域,用{}。文件本身是一个块。外部块可以访问内部块。
Go默认从package main的main函数进行。
定义:type xx struct{key1 string, key2 int}
使用:
m := xx{
key1: value1
key2: value2
}
或者
m:=xx{value1,value2}
结构体与后面的方法组合起来,可以模拟类。
和java大同小异:
func XX(输入 输入格式) (输出格式){
return 输出
}
在输入框中,可以用…表示任意数量的变量
在Go中,可以将函数名放到前面作为变量:
XX:=func (输入 输入格式) (输出格式){
return 输出
}
即可以将 func (输入 输入格式) (输出格式) 作为一种数据类型进行传输,后面加一个()就可以执行一次这个函数变量,非常像java中的内联函数。
方法非常像函数,只是多了一个接收者。之所以这么定义,是为了模拟面向对象的类,使用type和方法就可以模拟类。
方法定义:func (m *Movie) summary(xx int) string{}
调用:m := Movie{…}; m.summary()
接口定义:type XX interface{PowerOn() string},定义了接口名、需实现的方法等。
然后因为函数并没有implement关键字,所以实现接口的时候看不出来implement的是谁,最好加注释说明。
numbers := []int{1,2,3,4}
for i,n := range numbers{
fmt.Println(n)
}
for {这里面的语句会不停执行,要自己加停止条件}
package main
import "net/http"
func hello(w http.ResponseWriter, r *http.Request){
w.Write([]byte("Hello world"))
}
func main(){
http.HandleFunc("/",hello)
http.ListenAndServe(":8000",nil)
}
//select基本用法
select {
case <- chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1:
// 如果成功向chan2写入数据,则进行该case处理语句
case <-time.After(5*time.Second):
// 如果上面都没有成功,则进入default处理流程。或者使用default执行默认操作
下面是例子
func showfunc(c chan string){
t := time.NewTicker(time.Second*2)
for {
c <- "function finished"
<-t.C
}
}
func main(){
c:=make(chan string)
stop:=make(chan bool)
go showfunc(c)
go func() {time.Sleep(time.Second*4);stop <- true}() //使用内联函数
fmt.Println("start immediately")
for {
select{
case <-stop:
return
case msg := <-c:
fmt.Println(msg)
}
}
}
main()