手记

Go语言数据类型


Go语言数据类型

变量

关键字var用来定义变量,有两种定义方式,如下:

显式定义法:

var num int

num = 123

var word string

word = "abc"

隐式定义法:只能在函数内部这样定义使用

num := 123

word := "abc"

退化赋值:前提条件是--最少有一个新的变量被定义,且必须是同一作用域

package main

import(

"log"

"os"

)

func main(){

f,err := os.Open("/dev/random")

buf := make([]byte,1024)

n,err = f.Read(buf) 

}

多变量赋值

x,y := 123,"add"

变量命名

以字母或者下划线开始,然后再由多个字母,数字和下划线组成

区分大小写

驼峰样式命名

局部变量优先使用短名

专有名词要大写

避免使用系统关键字

常量

常量值必须是编译期间可以确定的数字、符号,字符串或者布尔值。可以指定常量类型或者由编译器通过初始化值推断。常量是只读的。

常量不像是变量一样在运行期间分配存储内存,通常会在编译器预处理阶段展开,作为指令数据使用。

定义方法如下:

package main

import "fmt"

func main(){

const(

    a   = 120

    b

    c = "FUNK "

    d

)

fmt.Printf("%T,%v\n",a,b)

fmt.Printf("%T,%v\n",c,d)

}

)

枚举

Go没有明确的enmu的定义,但是借助iota来实现一组自增的枚举类型

package main

import "fmt"

func main(){

const(

a = iota

b // 1

c // 2

d // 3

)

fmt.Printf("%T,%v\t%v\t%v\t",a,b,c,d)

}

基本类型

类型 长度 默认值   说明

bool  1  false 

byte  1  0  unit8

int,unit 4,8   0  默认整数类型

int8,unit8  1  0  -128~127,0~255

int16,uint16   2  0  -32768~32767,0~65535

int32,uint32   4  0  -21亿~21亿,0~42亿

int64,uint64   8  0  

float32  4  0.0   

float64  8  0.0   默认浮点类型

complex64   8     

complex128  16    

rune  4  0  unicode point,int32

unitptr  4,8   0  足以存指针

支持八进制,十六进制,以及科学计数法的math模块小例子如下:

package main

import (

    "fmt"

    "math"

)

func main(){

    //二进制,八进制,十六进制以及int8长度小例子

    a,b,c := 102,0132,0x33

    fmt.Printf("0b%b,%#o,%#x\n",a,b,c)

    fmt.Println(math.MinInt8,math.MaxInt8)

    //浮点数小例子:要注意小数位的精度

    var d float32 = 12.34141592777

    var e float64 = 12.344566346516346145453453454546562111

    var f float32 = 12.6

    fmt.Println(d,e,f)

    fmt.Printf("%v---%v----%v",d,e,f)

}

引用类型

主要是特指一下的三种类型:

slice

map

channel

相比数字,数组等类型,引用类型具有更复杂的存储结构,除了内存分配之外,他们还初始化一系列属性,诸如指针,长度,甚至包含哈希分布,数据队列等

内置函数new按照指定的类型长度分配零值内存,返回指针。并不关心类型内部构造和初始化方式。而引用类型则必须使用make函数创建,编译器会将make转换为目标类型专用的创建函数(指令),以确保完成内部内存分配和相关属性的初始化。

package main

import(

    "fmt"

)

func mkslice() []int{

    s : = make([]int,0,10)

    s = append(s,100)

    return s

}

func mkmap() map[string] int{

    m := make(map[string]int)

    m["a"] = 1

    return m

}

func main(){

    m := mkmap()

    fmt.Println(m["a"])

    s := mkslice()

    fmt.Println(s[0])

}

new函数可以为引用类型分配内存,但这是不完整创建。以字典为例,它仅仅分配了字典类型本身所需要的内存,但没有分配键值存储的内存,也没有初始化散列桶等内部属性,因此无法正常工作.

package main

import(

    "fmt"

)

func main(){

    p := new(map[string]int}

    m := *p

    m["a"] = 1

    fmt.Println(m)

类型转换

隐式转换造成的问题要远大于显式转换,除了常量,别名类型以及未命名类型外,go还强制要求使用显式类型转换,加上不支持操作符重载,所以我们总是能确定语句表达的明确含义。

自定义类型

使用关键字type定义用户自定义数据类型,包括基于现有基础类型的构建,或者是结构体,函数类型等。

©著作权归作者所有:来自51CTO博客作者Walix的原创作品,如需转载,请注明出处,否则将追究法律责任


0人推荐
随时随地看视频
慕课网APP