此笔记是本人在学习Go语言过程中对知识点进行记录,以方便之后查阅学习,如果有不合理的地方欢迎各位大佬指出!
1.变量
var a,b,c bool //定义
var c string = "helllo" //赋值
2.变量类型
3.常量
4.特殊的常量----------枚举类型
5.条件语句
if条件中可以赋值
6.switch语句会自动添加break语句,除非使用fallthrough,最后的默认情况使用default panic。switch中也可以没有语句,直接放到case中
7.for循环
和其他语言的区别在于省略掉小括号,同时初始条件、自增条件以及所有的条件都可以不写,这样是一个死循环
8.Go语言中只有值传递,没有引用传递,但是可以利用指针达到类似引用传递的效果
9.指针
10.数组
11.Slice
关于切片可以参考以下链接:slice入门
slice初始化的问题可以参考以下链接:slice初始化
12.Map
m := make(map[string] string)
n := map[string] string {
"cat" : "wanwan",
"dog" : "baibai",
"language" : "Chinese",
"country" : "China",
}
13.结构体struct
type treeNode struct {
value int
right,left *treeNode
}
var root treeNode
root = treeNode{value : 3}
root.right =&treeNode{}
root.left = &treeNode{5,nil,nil}
root.right.left = &treeNode{8,nil,nil}
root.left.right = new(treeNode)
root.right.right = createTreeNode(7)
func createTreeNode(v int) *treeNode {
return &treeNode{
value:v
}
}
func (node *treeNode) setValue (value int) {
node.value = value
}
root.right.setValue(12)
注意:struct中的方法接收者的类型可以是值类型,也可以是指针类型,但是只有指针类型才会改变值。而且,在调用方法时自动做了优化处理对传入的指针和值进行处理
14.封装
15.包
在练习包和封装时,出现了无法导入工程中的包,我使用的IDE是idea,在另一个文件中使用另一个包的函数时,只需要包名.方法即可使用,并且会自动import相应的包名,但是我的毫无反应,经过多次度娘寻求帮助,最后发现时GoROOT配置错误,它的配置可以具体参考如下这篇博客,很详细
Intellij IDEA创建Go工程
16.官方推荐:所有项目和第三方库都放在同一个GOPATH下
也可以将每个项目放在不同的GOPATH下
1)go get下载第三方库
2)gopm来获取无法下载的包
3)安装gopm命令:
go get github.com/gpmgo/gopm
有时候去遇到网站可以打开,但是go get一直不动的状态,还没有找到解决的办法
执行完此条命令后,会在bin目录下生成gopm.exe
4)接下来可以运行以下指令
gopm get -g -v -u golang.org/x/tools/cmd/goimports
在下载的过程中,有时会出现缺少某些包的情况,只需要在对应的路径下下载相应的包即可解决问题
5)
go build golang.org/x/tools/cmd/goimports
会在bin文件夹中生成imports的exe,go install有时不好使,只需要使用go build即可
17.Go中每个目录下面都有一个main文件,如果每个目录下有多个main函数,则无法编译成功
18.接口
Go语言中没有继承和多态,这些是通过接口来实现的
1)duck typing的概念
描述事物的外部行为而非内部结构
严格来说go属于结构化类型系统,类似duck typing
2)实现者指明不需要实现某个接口,只需要实现接口中的方法,由使用者规定必须有接口中的方法
3)接口定义
type Retriever interface {
Get (source string) string
}
func download(r Retriever) string{
return r.Get("http://www.imooc.com")
}
4)接口的值类型
interface{}
//type switch
switch v := r.(type) {
case baidu.Retriever: {
fmt.Println("Contents:",v.Contents)
}
case *real.Retriever: {
fmt.Println("UserAgent:",v.UserAgent)
}
//type assertion
if realRetriever,ok := r.(*real.Retriever); ok {
fmt.Println(realRetriever.UserAgent)
}else {
fmt.Println("not realRetriever")
}
-接口的组合
type Retriever interface {
Get(url string) string
}
type Poster interface {
Post(url string,
form map[string] string) string
}
//组合接口
type RetrieverPoster interface {
Retriever
Poster
}
type Stringer interface {
String() string
}
可以通过重写string方法实现Stringer接口
2)
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
19.函数式编程
20.资源管理与出错处理
file,err := os.OpenFile(filename,os.O_EXCL|os.O_CREATE,0666)
err = errors.New("This is a custom error") //自定义error
if err != nil {
if pathError,ok := err.(*os.PathError); ok {
fmt.Println(pathError.Err)
}else {
fmt.Printf("unkown error",err)
}
}
21.panic
22.recover
23.测试
测试的文件名可以命名为xxx_test
package main
import (
"fmt"
"math"
)
func calTriangle(a,b int) int {
var c int
c = int(math.Sqrt(float64(a*a+b*b)))
return c
}
func triangle() {
var a,b int = 3,4
fmt.Println(calTriangle(a,b))
}
func main() {
triangle()
}
package main
import (
"testing"
)
//测试代码,注意此处的测试代码的函数名开头必须为Testxxx,系统方可识别
func TestTriangle**(t *testing.T) {
tests := []struct{a,b,c int} {
{3,4,5},
{5,12,13},
{8,15,17},
{12,15,19},
}
for _, v:= range tests {
if actual := calTriangle(v.a,v.b); actual != v.c {
t.Errorf("calTriangle(%d,%d);"+
"got %d; expected %d",
v.a,v.b,actual,v.c)
}
}
}
go tool cover -html=c.out
func BenchmarkDupStr(b *testing.B) {
s := "黑化肥挥发发灰会花飞灰化肥挥发发黑会飞花"
a := 8
for i:=0;i
代码性能测试结果如下:
同样,通过终端输入以下命令也可以得到类似的结果
go test -bench .