Go语言学习笔记(一)

入职百度一周多,主要的工作就是学习go语言,之前就对go这门语言有一个大概的了解,go在中国的热度可以说是领跑全世界,下面将是我记录学习go当中挖坑的种种过程.

首先比较奇葩的是go的一个包管理机制,分别有两个环境变量控制:GOROOT和GOPATH.GOROOT存放的是go官方提供的标准库(src)、中间编译过程(pkg)、二进制文件(bin).GOPATH的目录结构也一样,都存在"bin"、"pkg"、"src"三个目录,作为第三方库或者项目存放的地方(官方也是这么推荐的)。当然我们也可以另外设置或添加不同的GOPATH,以供不同项目使用。go本身将git程序集成到"go"这个二进制文件里,可以直接通过"go get ..."去拿到需要使用的第三方库,golang.org和github.com都提供的大量第三方库,可以"get"下来然后通过"go install ..."到GOPATH中的bin目录直接使用,非常方便.这点就感觉go的设计很有python中pip的风格. 在这里面会经常遇到一个问题,就是golang.org被墙掉了,那么可以使用gopm这个工具。这个工具提供了一个翻墙"go get ..."的工作,用法可以直接替换"go",比如"gopm get ..."等操作.这个工具的地址为"github.com/gpmgo/gopm".

第二个遇到的问题,跟go语言本身的设计有关.我们都知道go是一个面向接口编程,与我们Java、C++这种面向对象编程有一个不同就是,当一个接口(interface)定义了一个方法,只要一个结构体(struct)实现了这个方法,就相当于实现了这个接口了.比如我在A.go中定义了一个接口:

// 定义接口
type Retriever interface {
	GetURL(url string) string
}
复制代码

然后在B.go中定义一个结构体实现该接口:

type Reciver struct {
}

// 隐式实现Retriever接口
func (r Reciver) GetURL(url string) string {
	res, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	result, err := httputil.DumpResponse(res, true)
	if err != nil {
		panic(err)
	}

	return string(result)
}
复制代码

那么我将如何使用该这个接口呢?

var r Retriever
r = real.Reciver{}
复制代码

注意到没,我声明的是Retriever接口,但是在赋值的时候,用的是Reciver,而不是直接就可以使用Retriever去生成.在面向对象的Java中,我们可以直接就赋值为Retriever,因为我们实现了这个接口,可以直接使用实现该接口去生成一个实例.这是go语言中非常有趣的一点.虽然我们认为r是一个Retriever,但是要通过一个实际上实现了该接口的结构体去赋值,编译器能够通过编译.

转载于:https://juejin.im/post/5c050eda6fb9a049fb4369c3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值