从零开始学习GO----数据类型(1)

GO数据类型

  1. string
  2. int
  3. bool
  4. float
  5. map
  6. array
  7. slice
  8. chan
  9. interface
  10. structure

基础数据类型

string:
GO语言中字符串使用双引号来标注字符串内容,go语言里的字符串实现是使用UTF-8编码

s1 := "hello"
s2 := "你好"

多行字符串

s1 := `第一行
第二行
第三行
`

字符串由一个个的字符组成,可以通过遍历获得单个字符,字符用单引号包裹起来。

var z = 'W'

Go语言的字符有2种:
1.uint8类型,简称byte类型,代表一个ASCII码的一个字符
2.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()
}

输出

104(h) 101(e) 108(l) 108(l) 111(o) 228(ä) 184(¸) 150() 231(ç) 149() 140() 

104(h) 101(e) 108(l) 108(l) 111(o) 19990() 30028() 

修改字符串(有中文的或者复杂的需要转化为rune来修改)
字符串的修改其实是重新分配内存,并复制内容,然后修改变量的指向,原来的地址字符串是不会修改的。

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

    s2 := "外国人"
    runeS2 := []rune(s2)
    runeS2[0] = '中'
    fmt.Println(string(runeS2))
}

int类型:
具体int类型可分文有符号和无符号,具体有uint8 uint16…
int类型分32位和64位系统,32位系统int类型占4字节,64位占8字节,uint同理,rune等价于int32,byte等价于uint8

bool类型:
布尔类型数据只有true(真)和 false(假)两个值
布尔类型默认值为false
Go语言不允许整型转为布尔型

float类型:
float32(单精度类型,占据4个字节 byte,32个二进制位 bit)
float64(双精度类型,占据8个字节 byte,64个二进制位 bit)
具体内存可以参考下面的文章:
blog.csdn.net/a451343010/article/d...

map类型:
Go语言中的map是引用类型,必须初始化才能使用,map的变量默认初始值为nil,需要使用make()函数来分配内存,make()用于slice,map,channel的初始化,new(T)函数返回指针,指向T的零值。

Array数组类型:
var 数组变量名 [元素数量]类型
数组是同一种数据类型的集合,在数组声明的时候就确定了数组的元素个数,数组的个数和类型是不能修改的,数组是值类型,赋值和传参会复制整个数组。

var arr_tmpa [3]int
var arr_tmpb [4]string
//自行推断数组的个数
var arr_tmpc = [...]int{3,7,9,11}

slice类型
切片是一个拥有相同元素的可变长度的序列,基于数组类型的封装,它的结构包含地址,长度和容量,它是一个引用类型。

var city []T

切片拥有自己的长度和容量,可通过内置函数len()和cap()来求切片的长度和容量,切片的底层是一个数组array,所以可以基于数组通过切片表达式得到切片,切片表达式中的low和high表示一个索引范围(左包含,右不包含),长度=high-low,容量等于得到切片的底层数组的容量。

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    s := a[1:3]  // s := a[low:high]
    fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
}
//输出
s:[2 3] len(s):2 cap(s):4
func main() {
    a := [5]int{1, 2, 3, 4, 5}
    s := a[1:3]  // s := a[low:high]
    fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
    s2 := s[3:4]  // 索引的上限是cap(s)而不是len(s)
    fmt.Printf("s2:%v len(s2):%v cap(s2):%v\n", s2, len(s2), cap(s2))
}
//输出
s:[2 3] len(s):2 cap(s):4
s2:[5] len(s2):1 cap(s2):1
go
本作品采用《CC 协议》,转载必须注明作者和本文链接
打不死的小强
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!