积木成楼
首页 / golang

golang base (one)

2019-05-08 · golang · 约 21 分钟

程序入口

变量,常量以及与其它语言的区别

编写测试程序

变量与其它静态编程语言的差异

常量与其它静态编程语言的差异

数据类型

整型占用字节问题

数值范围

类型长度(字节)数值范围
int81-128~127 (-2^(8-1) ~ 2^7-1)
uint810~255 (0 ~ 2^8-1)
int162-32768~32767
uint1620~65535
int324-2^31 ~ 2^31-1 (-2147483648~2147483647)
uint32402^32-1 (04294967295)
int648-2^63 ~2^63-1
uint6480~2^63

数据类型与其它静态编程语言的差异

golang代码编写最佳实践

运算符号与其它静态编程语言的差异

算术运算符

比较运算符

逻辑运算符

位运算符号

第八讲 流程控制

只有 for 一个关键字

  // while 循环
  func TestWhileLoop(t *testing.T){
    n:= 0
    for n <5{
    n++
    t.Log(n)
    }
    // 无限循环
    for{

    }
    // 这个类似于 goto 与 php 的 break 2 跳出指定的控制结构
    n:= 0
    m:=0
    I:
    for m < 5 {
        m++
        t.Log(m)
        for n <5{
            n++
            if n>3{
                break I
            }
            t.Log(n)
        }
    }
  }

if 条件

if condition {
    // code will be executed if condition is true
}  else if condition-1 {
    // code will be executed if condition-1 is true
} else {
    // code will be executed if condition-1 and condition are false
}
// 前半部分支持 赋值
if var delaration; condition{

}

switch 条件

第九讲 数组与切片

数组

    var arr [3]int            // 声明并初始化为默认零值
    t.Log(arr[0], arr[1])     // 0,0
    arr1 := [3]int{1}         // 声明并初始化
    t.Log(arr1[0], arr1[1])   // 1,0
    arr2 := [...]int{1, 1, 1} // 声明并初始化 ... 代表根据后面的值来确定前面的长度
    t.Log(arr2[0], arr2[1])   // 1,1
    arr2[2] = 3               // 修改 直接访问下标即可

    // 多维数组的声明
    b := [2][3]int{{1, 2, 3}, {2, 3}}
    t.Log(b)
    c := [2][2]int{{2, 3}, {1, 2}}
    t.Log(c)
    arr := [...]int{1, 2, 3, 4, 5, 6}
    // 原始 for 循环
    for i := 0; i < len(arr); i++ {
        t.Log(arr[i])
    }
    // for range 类似于 php foreach
    for _, e := range arr {
        t.Log(e)
    }
    // 数组截取操作 包括开始不包括结束
    arr := [...]int{1, 2, 3, 4, 5, 6}
    a1 := arr[:3]
    a2 := arr[1:3]
    a3 := arr[1:]
    a4 := arr[1:2]
    a4 = append(a4, 1)
    t.Log(len(a4), cap(a4))// len 2 cap 5
    t.Log(a4[1])
    // 截取出来的东西 实际上是一个 slice
    // 修改slice的值后 其它截取的slice 都发生了改变 也就是 说
    // slice 实际上是对于 arr 的一个引用 并没有实际的空间去存储值
    t.Log(a1, a2, a3, a4, arr)

切片

    // slice 可以看作一个结构体 包括三部分
    // 指针 指向连续内存 数组 *ptr
    // len 元素的个数 len
    // cap 内部数组的容量

    // 声明 区别在于 不用加 ... 与显示的申明长度
    var s0 []int
    s0 = append(s0, 1) // 增 append 后记得接受值
    t.Log(len(s0), cap(s0))//1,1

    s1 := []int{1, 2}
    t.Log(len(s1), cap(s1))//2,2

    // make 可用于声明一个 slice 第二个c
    s2 := make([]int, 3, 5) // 长度为3 容量为5
    t.Log(len(s2), cap(s2))
    t.Log(s2[0], s2[1], s2[2])
    // len 初始化元素的个数
    // cap 总容量
    s2 = append(s2, 1)
    t.Log(len(s2), cap(s2)) // 4,5
    s2 = append(s2, 2)
    t.Log(len(s2), cap(s2)) // 5,5
    s2 = append(s2, 3)
    t.Log(len(s2), cap(s2)) // 6,10
    // 如果新申请容量(cap)大于2倍的旧容量(old.cap),最终容量(newcap)就是新申请的容量(cap)
    // 如果旧切片长度大于等于1024,则最终容量(newcap)从旧容量(old.cap)开始循环增加原来的 1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最终容量(newcap)大于等于新申请的容量(cap),即(newcap >= cap)
    // 如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)

    // 切片共享存储结构
    year := []string{
        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
        "Nov", "Dec"}
    Q2 := year[3:6]
    t.Log(Q2, len(Q2), cap(Q2))// 3,9
    summer := year[5:8]
    t.Log(summer,len(summer), cap(summer))
    summer[0] = "unKnow"
    t.Log(Q2,year)
    // 共享内存修改值会相互影响

区别

← 返回文章列表