Go开发学习

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))
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇