Go语言数据类型
2017-11-30 19:12
751 查看
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 | 足以存指针 |
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定义用户自定义数据类型,包括基于现有基础类型的构建,或者是结构体,函数类型等。
相关文章推荐
- Go语言中其他数据与字符串类型的转换
- [go语言]基本数据类型
- go语言中的数据类型
- Go 语言的基本数据类型
- go语言快速入门:数据类型使用例(4)
- Go 语言——数据类型
- Go语言中怎样判断数据类型
- Go 语言的基本数据类型
- Go语言之数据类型详解
- GO语言基本数据类型总结
- 【Go学习笔记】go语言中的基本数据类型和包的介绍(一)
- go语言学习-数据类型
- go语言基本数据类型
- Go语言之基本数据类型以及一些规范
- 02-Go语言数据类型与变量
- Go语言学习笔记 --- 常量、变量、批量定义与声明、数据类型、类型别名、类型转换
- Go语言 2 变量、常量和数据类型
- Go语言之数据类型总结
- Go 语言中数据类型的判断