标识符与关键字

在了解数据类型之前,先了解一下go的标识符和关键字

标识符

__abc__123a123

关键字

关键字是指语言预先定义好的具有特殊含义的标识符。 关键字和保留字都不建议用作变量名。

Go语言有25个关键字:

    break        default      func         interface    select
    case         defer        go           map          struct
    chan         else         goto         package      switch
    const        fallthrough  if           range        type
    continue     for          import       return       var

Go语言中有37个保留字。

    Constants:    true  false  iota  nil

        Types:    int  int8  int16  int32  int64  
                  uint  uint8  uint16  uint32  uint64  uintptr
                  float32  float64  complex128  complex64
                  bool  byte  rune  string  error

    Functions:   make  len  cap  new  append  copy  close  delete
                 complex  real  imag
                 panic  recover

变量

什么是变量

程序运行过程中的数据都是保存在内存中,想要在代码中操作某个数据时就需要去内存上找到这个变量,但是如果直接在代码中通过内存地址去操作变量的话,代码的可读性会非常差而且还容易出错,所以就利用变量将这个数据的内存地址保存起来,以后直接通过这个变量就能找到内存上对应的数据了。

所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变

变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。

变量类型

变量(Variable)的功能是存储数据。不同的变量保存的数据类型可能会不一样。常见变量的数据类型有:整型、浮点型、布尔型等。

Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用

变量声明

Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。 并且Go语言的变量声明后必须使用,否则无法通过编译

标准声明

Go语言的变量声明格式为:

var 变量名 变量类型
var
var name string
var age int
var isTrue bool

批量声明

var
var (
    a string
    b int
    c bool
    d float32
)

变量的初始化

0空字符串falsenil

当然也可在声明变量的时候为其指定初始值。变量初始化的标准格式如下:

var 变量名 类型 = 表达式

var name string = "golang"
var age int = 18

或者一次初始化多个变量

var name, age = "golang", 20

类型推导

有时候会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。

var name = "golang"
var age = 18

短变量声明

:=
// 全局变量m
var m = 100

func main() {
 n := 10
 m := 200 // 此处声明局部变量m
 fmt.Println(m, n)
}

匿名变量

匿名变量(anonymous variable)_
func foo() (int, string) {
 return 10, "golang"
}
func main() {
 x, _ := foo()
 _, y := foo()
 fmt.Println("x=", x)
 fmt.Println("y=", y)
}

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。

注意事项:

varconstfunc:=_

常量

varconst
const pi = 3.1415
const e = 2.7182
pie

多个常量也可以一起声明:

const (
    pi = 3.1415
    e = 2.7182
)

const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。 例如:

const (
    n1 = 100
    n2
    n3
)
n1n2n3

常量可以作为枚举,常量组

const (
    Unknown = 0
    Female = 1
    Male = 2
)

常量组中如不指定类型和初始化值,则与上一行非空常量右值相同

func main() {
 const (
  x uint16 = 16
  y
  s = "abc"
  z
 )
 fmt.Printf("%T,%v\n", y, y) //uint16,16
 fmt.Printf("%T,%v\n", z, z) //string,abc
}

常量的注意事项:

  • 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
  • 不曾使用的常量,在编译的时候,是不会报错的
  • 显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量是可以是不同的类型值

iota

iota
iotaiota
const (
  n1 = iota //0
  n2        //1
  n3        //2
  n4        //3
 )
iota
_
const (
  n1 = iota //0
  n2        //1
  _
  n4        //3
 )
iota
const (
  n1 = iota //0
  n2 = 100  //100
  n3 = iota //2
  n4        //3
 )
 const n5 = iota //0
<<1<<101100000000002<<2101000
const (
  _  = iota
  KB = 1 << (10 * iota)
  MB = 1 << (10 * iota)
  GB = 1 << (10 * iota)
  TB = 1 << (10 * iota)
  PB = 1 << (10 * iota)
 )
iota
const (
  a, b = iota + 1, iota + 2 //iota = 0、a = 1, b = 2
  c, d                      //iota = 1、c = 2, d = 3
  e, f                      //iota = 2、e = 3, f = 4
 )

Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。

基本数据类型

整型

整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64

uint8byteint16shortint64long

特殊整型

intuintintuint
len()intintuint

数字字面量语法(Number literals syntax)

Go1.13版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:

v := 0b00101101v := 0o377v := 0x1p-2
_v := 123_456

将一个整数以不同进制形式展示:

func main(){
 // 十进制
 var a int = 10
 fmt.Printf("%d \n", a)  // 10
 fmt.Printf("%b \n", a)  // 1010  占位符%b表示二进制
 
 // 八进制  以0开头
 var b int = 077
 fmt.Printf("%o \n", b)  // 77
 
 // 十六进制  以0x开头
 var c int = 0xff
 fmt.Printf("%x \n", c)  // ff
 fmt.Printf("%X \n", c)  // FF
}

浮点型

float32float64IEEE 754float323.4e38math.MaxFloat32float641.8e308math.MaxFloat64
fmt%f
func main() {
        fmt.Printf("%f\n", math.Pi)
        fmt.Printf("%.2f\n", math.Pi)
}

复数

complex64complex128
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)

复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。

布尔值

booltrue(真)false(假)

注意:

false

字符串

UTF-8双引号(")
s1 := "hello"
s2 := "你好"

字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

打印一个Windows平台下的一个文件路径:

func main() {
    fmt.Println("str := \"d:\\go\\go.exe\"")
}

多行字符串

反引号
s1 := `第一行
第二行
第三行
`
fmt.Println(s1)

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

字符串的常用操作

byte和rune类型

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:

var a := '中'
var b := 'x'

Go 语言的字符有以下两种:

uint8ASCII码runeUTF-8字符
runeruneint32

Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

因为UTF8编码下一个中文汉字由3~4个字节组成,所以不能简单的按照字节去遍历一个包含中文的字符串

[]byte

修改字符串

[]rune[]bytestring
func changeString() {
 s1 := "big"
 // 强制类型转换
 byteS1 := []byte(s1)
 byteS1[0] = 'p'
 fmt.Println(string(byteS1))

 s2 := "白萝卜"
 runeS2 := []rune(s2)
 runeS2[0] = '红'
 fmt.Println(string(runeS2))
}

类型转换

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法如下:

T(表达式)

其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.

func sqrtDemo() {
 var a, b = 3, 4
 var c int
 // math.Sqrt()接收的参数是float64类型,需要强制转换
 c = int(math.Sqrt(float64(a*a + b*b)))
 fmt.Println(c)
}

运算符用于在程序运行时执行数学或逻辑运算。

运算符

Go 语言内置的运算符有:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符

算数运算符

++--

关系运算符

逻辑运算符

位运算符

位运算符对整数在内存中的二进制位进行操作。

赋值运算符

运算符优先级

有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。由上至下代表优先级由高到低:

当然,可以通过使用括号来临时提升某个表达式的整体运算优先级。