Go开发学习
go env
直接 go env 就是查看go的环境配置。
GO111MODULE
GO111MODULE=on,go命令行会使用modules,而不会去GOPATH目录下查找。
当modules功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。
go mod 使用
参考链接:https://www.jianshu.com/p/760c97ff644c
| 命令 | 说明 |
|---|---|
| download | download modules to local cache(下载依赖包) |
| edit | edit go.mod from tools or scripts(编辑go.mod) |
| graph | print module requirement graph (打印模块依赖图) |
| verify | initialize new module in current directory(在当前目录初始化mod) |
| tidy | add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
| vendor | make vendored copy of dependencies(将依赖复制到vendor下) |
| verify | verify dependencies have expected content (验证依赖是否正确) |
| why | explain why packages or modules are needed(解释为什么需要依赖) |
比较常用的是 init,tidy, edit
开发管理新项目
创建项目
mkdir go-ticket
cd go-ticket
go mod init goticket
会生成 go.mod 文件
module goticket
go 1.16
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
文件引用
比如现在目录下有这几个结构
.
├── go.mod
├── go.sum
├── main.go
└── movie-ticket
└── ticket.go
movie-ticket中的ticket.go
package movieticket
import (
"encoding/json"
"fmt"
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
// SmartContract provides functions for managing an Asset
type SmartContract struct {
contractapi.Contract
}
巴拉巴拉
main目录放在根目录,引入包
package main
import (
"log"
movieticket "goticket/movie-ticket"
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
func main() {
assetChaincode, err := contractapi.NewChaincode(&movieticket.SmartContract{})
if err != nil {
log.Panicf("Error creating asset-transfer-basic chaincode: %v", err)
}
if err := assetChaincode.Start(); err != nil {
log.Panicf("Error starting asset-transfer-basic chaincode: %v", err)
}
}
注意:包名不必和目录名一致,但为了更好的维护和更高的可读性,普遍的做法是报名和目录名一致,如若不一致,import的时候要写目录名,引用的时候要写包名。在这个例子里就很明显,前面是包名,后面是go mod init的模块名再加上目录名,并且和文件名没有关系。
一个文件夹下只能有一个package。
一个package的文件不能在多个文件夹下。
movieticket "goticket/movie-ticket"
生成依赖
写完代码,可以通过go mod tidy获取依赖包,或者直接go run 文件名 也会下载依赖包,通过 go mod vendor 能够把依赖包挪到当前项目的vendor文件夹,单独管理。
开发中的小坑
1、首字母大小写
Go语言有一个多少带点nt的操作就是,首字母大写才能被外部包访问。
而结构体中的字段名,如果首字母小写的话,则该字段无法被外部包访问和解析,比如json解析,需要写成下面这样子的才能被解析。如果希望json格式是小写字母,需要使用struct tag来表示。
type MovieTicket struct {
Type string `json:"type"`
Geometry ObjGeo `json:"geometry"`
Properties ObjPros `json:"properties"`
}
2、返回值不确定
从ts半强半弱的类型转到go这种强类型的有点不习惯,ts虽然有点强类型的表现,但是可以any啊。go么不太行,需要用interface {}来表示,下面是我自己写的一个例子。检验一共有两种方法,一个是在switch里面采用res.(type),另一种就是reflect.TypeOf。interface{} 转换类型的话采用str, ok := res.(type),ok为false则没有转成功。
package main
import (
"fmt"
"reflect"
)
// 导包
type Goodlist struct {
Name string
age int
}
func GetGoodsData(id int) interface{} {
good := Goodlist{Name: "狗季", age: 23}
if id == 1 {
return good
} else {
return "无此商品"
}
}
func main() {
res := GetGoodsData(1)
switch res.(type) { //多选语句switch
case string:
fmt.Println("这是string:", res)
case int:
fmt.Println("这是int:", res)
case Goodlist:
fmt.Println("这是Goodlist:", res)
str, ok := res.(string)
if ok == false {
fmt.Println("转换成str类型失败")
}
fmt.Println("这是强转的Goodlist:", str)
}
fmt.Println("反射type类型:", reflect.TypeOf(res))
}



