Go语言数据类型|青训营笔记

142 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。 主要介绍Go语言中的数据类型,并简单介绍一下几种常用类型的使用。

一 Go语言基本数据类型

1 整形

int      uint
int8     uint8
int16    uint16
int32    uint32
int64    uint64 
 
intuint32位机器上是4字节,在64位机器上是8字节 

使用math包获取整形值的最大值和最小值
math.MaxInt      math.MinInt
math.MaxInt32    math.MinInt32 
math.MaxInt64    math.MinInt64

2 浮点型

float32    float64

3 复数

complex32   complex64
如: 1+2i

4 布尔值

bool 1字节
可取值: true  false

5 字符

byte    uint8   一个ASCII码字符 
rune    int32   一个UTF-8字符

6 字符串

string

7 指针类型

如:
var p1 *int
var p2 *string

二 其他数据类型

1 数组

如: var arr [2]int

2 slice

初始化
如: var sli []int 
    sli = make([]int, 0)   // 必须先分配内存才能使用
或: sli := make([]int, 3)  // 0, 0, 0

增: sli = append(sli, 2, 3, 4)  // 0, 0, 0, 2, 3, 4 
删: sli = append(sli[:3], sli[4:]) // 0, 0, 0, 3, 4
改: sli[0] = 1   // 1, 0, 0, 3, 4
查: 遍历
浅拷贝: sli2 := sli[:3]     // sli和sli2共用一个底层数组
深拷贝: sli3 := make([]int, 3)
        copy(sli3, sli[:3]) // sli和sli3不共用底层数组
        
        
扩展应用
1 使用slice用作stack, 和C++中的stack对比
stack<int> s;      <---->  s := make([]int, 0)
s.push(1);         <---->  s = append(s, 1)
s.pop();           <---->  s = s[:len(s)-1]  // 需要判断len(s)是否为0
int x = s.top();   <---->  x := s[len(s)-1]  // 需要判断len(s)是否为0

2 使用slice用作queue, 和C++中的queue对比
queue<int> q;      <---->  q := make([]int, 0)
q.push(1);         <---->  q = append(q, 1)
q.pop();           <---->  q = q[1:]  // 需要判断len(q)是否为0
int x = q.front(); <---->  x := q[0]  // 需要判断len(q)是否为0
int y = q.back();  <---->  y := q[len(q)-1]  // 同上

slice实现的stack比queue更高效,原因是queue删除操作中,
会把后面的元素整体向前移动赋值,因为使用的是一个底层数组

3 map

如: var m map[int]int       // 必须先分配内存才能使用
    m = make(map[int]int)
或: m := make(map[int]int)  // 可不指明空间大小

增: m[1] = 10; m[2] = 20    // m{1:10, 2:20}
删: delete(m, 1)            // m{2:20}
改: m[2] = 10               // m{2:10}
查: v1,ok := m[1]  // 0, false  未找到也不会插入,和C++中的map区别
    v2,ok := m[2]  // 10, true

扩展应用
1 使用map用作set, 和C++中的set对比
set<int> st;     <---->   st := make(map[int]struct{})
st.insert(1);    <---->   st[1] = struct{}{}
st.remove(1);    <---->   delete(st, 1)
st.find(1);      <---->  _, ok := st[1]

空结构体不占空间,因此使用空结构体作为map的value

4 channel

无缓冲channel: ch := make(chan int)
有缓冲channel: ch := make(chan int, 1)

5 struct

如:
type user struct{
    name string
    age  int
}
u := user{"小明", 19}

6 func()

 func add(a,b int) int {
     return a+b
 }
 
 var f func(int, int) int
 f = add
 fmt.Println(f(1,3))  // 4

7 interface

1interface{} 可表示任意类型, 使用 .() 可以进行类型断言
    func printInt(a interface{}) {
        if value, ok := a.(int); ok {
		fmt.Println(value)
        } else {
		fmt.Println("输入不是整数")
        }
    }
    
    func main() {
        printInt(1)    // 1
        printInt("1")  // 输入不是整数
    }
2、用作多态
 type A interface {
     f()
 }

 type B struct{}
 func (b B) f() {
     fmt.Println("B...")
 }

 type C struct{}
 func (c C) f() {
     fmt.Println("C...")
 }

 func print(a A) { 
 // 接受一个A对象作为参数
 // B, C实现了A接口,因此B, C对象均可作为参数传入 
     a.f()
 }

 func main() {
     print(B{})  // B...
     print(C{})  // C...
 }

总结

Go语言除了上述数据类型之外,还有一些容器类型,
如container包中的list、heap、ring,这部分内容留待后续更新。

本文只是简单介绍了一下Go语言数据类型的种类,
对各数据类型的使用细节没有进行太过详细的介绍,
后续有时间继续对各类型的使用细节进行更新。