Go的第二课——Go的特性&变量

Go的一些特性

这次又学了点特性就是:

  • 如果引入的包在文件中没有被用到则会导致编译通不过,这一点比较匪夷所思了,因为很多语言都没有这种限制。
  • 同样,变量也有这个限制,定义的变量没有使用过也会报错。
  • 入口函数为 main 函数
  • 源文件必须 .go 为后缀
  • 大小写敏感的语言

标准api文档在线:https://studygolang.com/pkgdoc(PS:这玩意可以直接保存下来离线观看)

Go的变量

基础用法和注意事项

每个编程语言最基本的单位就是变量了,那来看看 go 的一个定义和操作变量的方法吧。

基本数据类型

  • 整数型((u)int(默认是64位),(u)int8,(u)int16,(u)int32,(u)int64,byte)
  • 浮点类型(float(默认是float64),float32,float64)
  • 字符型(没有专门的数据类型,一般使用 byte)
  • 布尔型(bool)
  • 字符串(string)

派生/复杂数据类型

  • 指针(pointer)
  • 数组([])
  • 结构体(struct)
  • 管道(Channel)
  • 函数(func)
  • 切片(slice)
  • 接口(interface)
  • 映射(map)

定义一个整形变量

1
var num int;

一般形式当然就是:

var 变量名 变量类型 ,也不同于我们平时的写法。

查看变量类型

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"
func main() {
var (
n1 int
)
n1 = 2147483647
fmt.Printf("%T", n1)
}
//int

查看变量所占用的空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
"unsafe"
)

var n int

func main() {
var (
n1 int
)
n1 = 2147483647
fmt.Printf("%T\n", n1)
fmt.Println(unsafe.Sizeof(n1))
}

注意事项

变量使用有以下注意事项

  • 如果指定了变量类型,则可以选择手动初始化,也可以选择自动初始化,自动初始化使用默认值0,如果是字符串则初始化为空字符串。
  • 若未指定变量类型,则一定要初始化,方便做类型推导,推导整数类型时一般为 int。
  • var 关键字可以不加,但是需要使用 := 的方式去赋值,否则会报错 undefined ,而 := 这个赋值符号只能对未定义的变量第一次赋值使用。

允许一句话声明多个变量,多个变量用逗号分隔,若不初始化则只能声明多个同类型变量

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
var n1, n2, n3 int
fmt.Println(n1, n2, n3)
}

也可以采取类型推导,此时允许声明不同类型的变量

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
var n1, n2, n3 = 1, "xia0ji233", 3
fmt.Println(n1, n2, n3)
}

在第二种方式中,若想省略 var 则需要把 = 替换为 :=

定义在函数体外部的叫全局变量,全局变量没有必须使用的限制。

整数类型注意事项

int 默认是 64 位有符号。

go 允许在计算的时候发生溢出,但是不允许赋值范围以外的一个数,比如 int8 的范围是 -128-127 那么我初始化一个 int8 的值为 128 就会直接在编译阶段报错。

浮点数类型注意事项

float 默认位 64 位的精度。

浮点数会有精度问题,若发现精度有所丢失则需要考虑使用 float64。

计算机的科学计数法表示的浮点常量如下所示:

  • $5e6=5\times 10^6$
  • $3e9=5\times 10^9$

字符类型

golang 中没有 char 类型,但是存在字符常量,一般使用 byte 类型保存。

1
byte c='a';

但是直接输出会当成整形输出,如果要输出字符那么可以使用格式化字符串输出的 %c 参数。

如果尝试保存中文则会因为类型问题无法保存,此时只能使用 int 前来保存单个中文字符,同样要输出这个字符也是使用格式化字符串的 %c 打印。

golang 使用 UTF-8 强制编码,因此在编程中很少遇到乱码问题(挺好的)。

布尔类型

唯一的区别就是不能使用数字赋值,只能使用 truefalse 赋值。

字符串类型

字符串本质就是字符序列,使用 UTF-8 强制编码。

golang 中的字符串一旦赋值之后是不可变的,这里的不可修改指的是不能单独修改字符串中其中一个字符的内容,给字符串重新赋值是允许的。

字符串常量可以使用反引号包裹,反引号的内容不会被转义而是被原样输出,有点类似于 python 的三双引号。

但是因为只有一个反引号,所以说我想在反引号里面加一个反引号字符的话目前是做不到的,只能采用字符串拼接的方法加上去。

字符串可以使用 + 拼接。允许换行加法,但是一定要注意加法不能开头,也就是说下面这种写法是错的

1
2
var s string="123"
+"456";

而下面的写法是正确的

1
2
var s string="123"+
"456";

变量基本运算

首先是加法运算符(+),对于数值来说会使两个数值相加,对于两个字符串来说,会使两个字符串进行拼接。