go基础部分一 | 青训营笔记

125 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

今天的主要和大家分享go的基础知识部分,主要包括变量常量和一部分基础类型介绍。

变量和常量

func main() {
    var a int //声明一个int型的变量,默认值是0
    fmt.Println("a的默认值是:", a)
    fmt.Printf("a的类型是:%T \n", a)
    var b int = 1
    fmt.Println("a的默认值是:", b)
    fmt.Printf("a的类型是:%T \n", b)
    c := "字符串" //短声明方式
    fmt.Printf("c的类型是: %T,c的值是: %s \n", c, c)
}
/* a的默认值是: 0
a的类型是:int 
a的默认值是: 1
a的类型是:int 
c的类型是: string,c的值是: 字符串 */

短声明的其他注意事项:短变量声明

一次声明多个变量:

var (
    n = 1,
    m = 2
)
​
var q, p = 1, 2

go中的常量可以使用const来声明,同时在go里也可以用来做枚举:

const n = 1000
​
const (
    BEIJING = 1
    TIANJIN = 2
) 

同时go也提供了iota作为常量计数器,使用方法:

func main() {
    const (
        a = 10 * iota
        b
        c
    )
    fmt.Printf("%d %d %d\n", a, b, c)
}
//0 10 20   不加10来设置步长 则默认为 0 1 2

大值常量

常量可以储存很大的值,此时其描述为无类型,并且在go底层使用big包进行处理:

func main() {
    const a = 200000000000000000000 // untyped int 没办法直接输出,但是可以进行运算,此时go底层使用big包处理
    const b = 22343
    const c = a / b
    fmt.Println(c) // 8951349415924450
}

数据类型

整形 Integer

int 包括 int8 int16 int32 int64 其中直接声明int型,变量根据系统是32位还是64位,决定其大小占几位和范围。例如64位系统下,int就和int64一样

无符号整形 unsignedInteger:

uint包括 uint8 uint16 uint32 uint64

浮点型 float

float包括 float32 和 float64

小知识: 如果一个指数型的数字( a := 2e5 )没有被指定类型的时候,那么它默认为float64类型,因为float64的范围是很大的,这和其精度没有关系,其最大值为1.8e308

字符串 string

string类型是字符串,go里面必须使用双引号包裹

切分字符串

可以利用创建切片的语法来切分字符串:

func main() {
    s := "hello world"
    s2 := s[:5]
    fmt.Println(s2) // hello
}

注意

s := "a"
s = s[1:]

上述写法并不会报错,而是返回一个空字符串。

大数 big

虽然我们可以使用float64来很大的数,但这样不能保证对应的精度。此时我们可以使用big包来获取很大同时保证精度的值:

// 使用newInt创建,函数接收值为一个int64类型的数
a := big.NewInt(12)
​
// 使用SetString创建超过int64上限的大数
a := new(big.Int)
a.SetString("240000000000000000000000000000000000000000", 10)

字符 Rune

用来表示字符,并且兼容中文,韩文等特殊符号等字符,其本质是一个int32。

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32

数组

var arr [5]int
arr[0] = 1//短声明
arr := [5]int{15, 20} //后面不声明的默认是0//通过制定索引,对某几个元素进行赋值
arr4 := [5]int{1: 100, 4:200}
​
//让编译器帮忙计算值
arr4 := [...]int{14, 20} 

注意数组的长度也是数类型的一部分,例如[3]int[5] int不是一种类型。所以函数一般是使用切片而不是数组作为形参。

数组是一个值类型,并不是一个引用类型。如果我们传递数组需要使用同一个地址而不是复制,可以使用指针:

func main() {
    a1 := [...]int{1, 2, 3}
    a2 := &a1
    (*a2)[1] = 3
    fmt.Println(a1, *a2) //[1 3 3] [1 3 3]
}