go的几种特殊语法 | 青训营笔记

539 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

(内容根据字节跳动青训营课程内容以及自己的理解编写)

近期将日更这几个主题的文章,欢迎关注!

  • 全面理解go协程
  • channel通信
  • Kitex
  • Hertx
  • Gorm
  • go的测试环节

这篇文章主要是我刚接触go语言,新接触的一些写法

一些约定

在一开始的时候,我们在安装go的时候,定义了GOPATH

我定义的GOPATH是"D:\Programming\Go"

一般的约定是,在GOPATH底下新建src目录,然后在里面存储go项目,比如:

image.png

后面我们在安装包的时候,或者打包的时候会自己生成以下的目录结构

pkg,bin,src

image.png

Sprintf

菜鸟教程地址

image.png

func main() {
   fmt.Println("hello world")

   var str = fmt.Sprintf("%s这是个打印的字符串%s", "字符串1","字符串2")

   fmt.Println(str)
}

运行结果:

image.png

这两个的区别就是Print一个是写入输出流,Sprintf一个是返回字符串(Sprintf相当于python里面的模板字符串)

函数返回值类型可以不止一个

这里拿一个将字符串转换为数字的方法Atoi作为例子

func main() {
   // 转换正确
   num, err := strconv.Atoi("123")
   if err != nil {
      fmt.Println(err)
   }else {
      fmt.Println(num)
   }

   // 转换错误
   waNum, err := strconv.Atoi("java")
   if err != nil {
      fmt.Println(err)
   }else {
      fmt.Println(waNum)
   }
}

运行结果:

image.png

可以看到我们接受了两个返回值!

空白标识符- 也被用于抛弃值,如值5 在:_, b = 5, 7 中被抛弃。

-实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

-可以在一个函数里面多次调用,不会报错的

-后面就不可以跟:=了,因为:=相当于先初始化再赋值,_不能初始化)

分号

go在编译的时候是会自己帮你加分号的,你也可以自己加,于是有一种不推荐的写法,看得懂就行

上面字符串转换函数Atoi也可以简写成:

func main() {
   // 转换正确
   if num, err := strconv.Atoi("123"); err != nil {
      fmt.Println(err)
   }else {
      fmt.Println(num)
   }
}

随机数写法

这里要比平时多加一个种子条件

maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)

json序列化

go进行序列化和反序列化也十分简单:

answer, err := json.Marshal(request)

如果要在序列化和反序列化的时候想让他自动类型转换的话,我们就需要在定义结构体的时候加上tag

(结构体就类似java的类)

type DictRequest struct {
   TransType string `json:"trans_type"`
   Source    string `json:"source"`
   UserID    string `json:"user_id"`
}

一些有用网站

1.开启代理

SwitchyOmega插件

比如开启127.0.0.1的话,你访问网页流量就会用的是127.0.0.1的了

image.png

2.根据curl生成请求代码的网站:

curlconverter.com/#go

image.png

image.png