博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言数据类型
阅读量:7094 次
发布时间:2019-06-28

本文共 2397 字,大约阅读时间需要 7 分钟。

Go语言数据类型

变量

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

  • 显式定义法:
    var num intnum = 123var word stringword = "abc"
  • 隐式定义法:只能在函数内部这样定义使用
    num := 123word := "abc"
  • 退化赋值:前提条件是--最少有一个新的变量被定义,且必须是同一作用域

    package mainimport("log""os")func main(){f,err := os.Open("/dev/random")buf := make([]byte,1024)n,err = f.Read(buf) }
  • 多变量赋值
    x,y := 123,"add"

    变量命名

  • 以字母或者下划线开始,然后再由多个字母,数字和下划线组成
  • 区分大小写
  • 驼峰样式命名
  • 局部变量优先使用短名
  • 专有名词要大写
  • 避免使用系统关键字

    常量

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

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

  • 定义方法如下:
    package mainimport "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 mainimport "fmt"func main(){const(a = iotab // 1c // 2d // 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 mainimport (    "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 mainimport(    "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 mainimport(    "fmt")func main(){    p := new(map[string]int}    m := *p    m["a"] = 1    fmt.Println(m)

类型转换

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

自定义类型

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

转载于:https://blog.51cto.com/11696827/2046193

你可能感兴趣的文章
华为OSPF 多区域配置
查看>>
自研数据库CynosDB存储系统如何实现即时恢复
查看>>
插入排序
查看>>
h5新增标签、css3新增属性
查看>>
为什么我这样做会出错,求教
查看>>
【Java多线程】的学习总结
查看>>
五分钟搭建你的第一个区块链应用
查看>>
家庭WiFi有限的访问权限
查看>>
自动化运维之 部署Saltstack 并批量部署 Nginx
查看>>
Linux常用中间件启动命令
查看>>
中文自动摘要的基本实现方法
查看>>
Python——正则表达式 re模块
查看>>
如何使Windows显示文件扩展名
查看>>
springmvc拦截器讲解
查看>>
linux memcached集群
查看>>
Spring Boot系列(五)创建jar与热部署
查看>>
财务数据分析工作总结汇报PPT模板
查看>>
泛型-自定义类上的泛型,方法的泛型
查看>>
基本指令和语句
查看>>
华为防火墙USG5500
查看>>