Listening to the Words

Go语言学习之基本类型

《Go语言学习之基本类型》

基本数据类型

Go和PHP一样提供了丰富的数据类型:

  • 整形(int),
  • 浮点型(float)
  • 字符串(string)
  • 布尔型(bool)
  • 数组(array)

这些都相同于PHP,同时还有PHP没有的结构

  • 切片(slice)
  • 映射 (map)
  • 结构体(struct)
  • 通道(channel)

Go中没有对象的概念,同时也没有PHP中的资源类型

整形integer

类型 描述
uint8 无符号 8位整型 (0 到 255)
uint16 无符号 16位整型 (0 到 65535)
uint32 无符号 32位整型 (0 到 4294967295)
uint64 无符号 64位整型 (0 到 18446744073709551615)
int8 有符号 8位整型 (-128 到 127)
int16 有符号 16位整型 (-32768 到 32767)
int32 有符号 32位整型 (-2147483648 到 2147483647)
int64 有符号 64位整型 (-9223372036854775808 到 9223372036854775807)

其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。

类型 描述
uint 32位操作系统上就是uint32,64位操作系统上就是uint64
int 32位操作系统上就是int32,64位操作系统上就是int64
uintptr 无符号整型,用于存放一个指针

在使用int和 uint类型时,不能假定它是32位或64位的整型,在不同平台上是由差异的,如同PHP的int类型在不同平台上也是不同的

package main

import "fmt"

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
}

浮点型(float)

Go语言里有两种类型的浮点数分别是 float32 和 float64
float32 的浮点数的最大范围约为 3.4e38, float64 的浮点数的最大范围约为 1.8e308

布尔值(boolean)

true 和 false

注意:

  1. 布尔类型变量的默认值为false。
  2. Go 语言中不允许将整型强制转换为布尔型.
  3. 布尔型无法参与数值运算,也无法与其他类型进行转换。

字符串(string)

Go采用UTF8编码作为字符串默认字符集,字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:

name:="新垣结衣"
name2:="長澤まさみ"

如果像定义多行字符串,就必须使用 反引号了 ``

name := `我老婆是
新垣结衣
Aragakki yui
`
fmt.Println(name)

字符串操作使用;strings库

byte和rune类型

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

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

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

  • uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
  • rune类型,代表一个 UTF-8字符。

当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。

// 遍历字符串
func traversalString() {
    s := "hello沙河"
    for i := 0; i < len(s); i++ { //byte
        fmt.Printf("%v(%c) ", s[i], s[i])
    }
    fmt.Println()
    for _, r := range s { //rune
        fmt.Printf("%v(%c) ", r, r)
    }
    fmt.Println()
}

因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

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

    s2 := "长泽雅美"
    runeS2 := []rune(s2)
    runeS2[0] = '镸'
    fmt.Println(string(runeS2))
}

点赞