go学习笔记(包和工具)

Package:

  1. 每一组文件被称为一个包,包关键词 package,如:package net/http
  2. 所有的go文件都必须在第一行声明包。
  3. 同一个文件目录下的go文件必须声明同一个包。
  4. 包的名称尽量简短,保持和目录名一致,如:net/http net/cgi等。net目录下的http和cgi目录都是不同的包。
  5. main包,每一个go应用程序都必须有一个main包。
  6. main包必须都唯一的main函数作为唯一的入口。

Import

  1. 导入多个包用括号括起来,如:
package main
import(
    _ "github.com/astaxie/beego/session/mysql"
  . "github.com/smartystreets/goconvey/convey"
    "net/http"
    "myfmt mylib/fmt"
    "fmt"
)
  1. 导入的多个包的时候,go会首先查找标准库中的包(/usr/local/go),其次查找GOPATH下的包。
  2. 包导入可以指定url(github.com/astaxie/beego/session/mysql)
  3. 每个包导入进来可以起个别名,在左边起个名字,如果包不用go编译的时候会报错。
  4. 如果包导进来不想用,只是作为初始化,比如数据库初始化,可以指定 _ 符号忽略它。
  5. 包名字设置为.代表为本地包在调用的时候,不需要使用包名.函数调用,直接函数()调用
func main() {
    //fmt.Println("hello") //用包的别名调用包的方法
    Println("hello") //省略包名直接调用,点代表省略包名调用,即本地包。
}
  1. 每个包可以包含多个init初始化函数。init中可以做包的初始化,在main函数执行前执行。

Command

Go --help 可以看到所有的命令。

  1. go build 后边可以跟包名称(包名和目录名一般一样),go文件,也可以跟3个点。表示匹配所有包。
go build . //当前目录
go build github.com/astaxie/beego/session/mysql
go build github.com/astaxie/beego/... //表示匹配beego下面所有的包。
  1. go run 运行go文件,包括编译的步骤。如:go run xxx.go

  2. go vet可以检测代码常见的错误,但不包含复杂的逻辑错误,提交代码前执行go vet就跟php 提交前执行php -l一样是个好习惯。

  3. gofmt 格式化代码。

  4. godoc支持命令,http服务等查看文档,也支持把自己写的代码生成成文档包含在官方文档里(规则网上查)。go doc 和godoc是两个东西。可以执行help查看具体使用方法。

go doc fmt Print //查看fmt包print方法
godoc --http=:81//启动一个端口为81的go http服务,浏览器localhost:81访问
  1. go get下载包到本地。很多包需要翻墙,可以指定阿里的镜像。GOPROXY="https://mirrors.aliyun.com/goproxy/"
go get -u github.com/astaxie/beego
  1. go env可以查看go的环境变量。
  2. go mod 管理go导入的包,go mod init 会在项目根目录下生成go.mod文件,运行程序的时候go mod会自动去查找下载需要的依赖包。
  3. go test 运行单元测试命令,可以go help test查看具体的用法。
go test -v ./tests -run=^TestPurpose$

指针 (指针类型,指针变量,指针地址)

go语言中的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移,从而避免了非法修改关键性数据的问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。go的指针有2个核心的概念:

  1. 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。
  2. 切片,由指向起始元素的原始指针、元素数量和容量组成。
var ptr *ptr-type //ptr称为指针变量,ptr-type称为指针的类型。
var var_name var_type // var_name变量名 var_type变量类型。
ptr = &var_name //代表指针变量的值是var_name在内存中的存储地址,也就是指针变量的地址
var pptr **ptr-type //代表指向指针的指针变量,意思就是指针变量存储的是另一个指针变量的地址。
//例如:
pptr = &ptr //ptr本身存储的是var_name的地址,&ptr代表指针的地址,赋值给pptr,那么pptr存储的就是指针变量的指针地址。

举个栗子。

之前开发的时候遇到过一个问题。如下:

//获取列表
func PaperTypeList(paperTypes *[]PaperType, count *int64, limit, offset int64, name string) error {
    query := getPaperQuery(name)
    //countResult := query.Count(&count) //错误的地方。
  countResult := query.Count(count)
    if countResult.Error != nil {
        if countResult.RecordNotFound() {
            return &exceptions.Empty
        }
        return &exceptions.Persistence
    }
    query = getPaperQuery(name)
    switch {
    case limit == -1:
    case limit > 0:
        query = query.Limit(limit)
    case limit > 100:
        limit = 100
        query = query.Limit(limit)
    default:
        limit = setup.PageSize
        query = query.Limit(limit)
    }
    if offset > 0 {
        query = query.Offset(offset)
    }
    result := query.Find(&paperTypes)
    if result.Error != nil {
        if result.RecordNotFound() {
            return &exceptions.Empty
        }
        return &exceptions.Persistence
    }
    return nil
}

//调用
var (
        paperTypes []models.PaperType
        total      int64
    )
if err := models.PaperTypeList(&paperTypes, &total, limit, offset, label); err != nil {
        self.Raise(err)
}

在上面错误的地方,我传了个地址进去,导致最终获取的count始终是0,单元测试过不了,debug的时候才发现count的地址发生了变化。

上面的原因就是count是个指针变量,然后query.Count(&count)时,等于把指向指针的指针变量传过去了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269