【从零开始捡起GO】3. 数据类型和声明

Go 语言数据类型

在 Go 编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

Go 语言按类别有以下几种数据类型

类型 描述
布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true
数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
字符串类型 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
派生类型 包括:指针类型(Pointer) 数组类型 结构化类型(struct) Channel 类型 函数类型 切片类型 接口类型(interface) Map 类型

布尔型

布尔型只有常量true/false,占用1字节

数字型

类型 大小 描述
int 4/8 会自动根据项目位数变成int32/int64
uint 4/8 会自动根据项目位数变成uint32/uint64,与int相比区别在于uint是无符号的u=unsign
uint8 1 无符号 8位整型 (0 到 255)
uint16 2 无符号 16位整型 (0 到 65535)
uint32 4 无符号 32位整型 (0 到 4294967295)
uint64 8 无符号 64位整型 (0 到 18446744073709551615)
int8 1 有符号 8位整型 (-128 到 127)
int16 2 有符号 16位整型 (-32768 到 32767)
int32 4 有符号 32位整型 (-2147483648 到 2147483647)
int64 8 有符号 64位整型 (-9223372036854775808 到 9223372036854775807)
float32 4 浮点型(小数)
float64 8 浮点型(小数),比float32更精确
complex64 8 complex64类型的值会由两个float32类型的值分别表示复数的实数部分和虚数部分。
complex128 16 complex128类型的值会由两个float64类型的值分别表示复数的实数部分和虚数部分。
byte 1 类似uint8
rune 4 类似int32
uintptr 8 无符号整型,用于存放一个指针

变量

声明变量

声明变量的一般形式是使用 var 关键字:var 变量名 变量类型 可以一次声明多个变量,用,隔开:var 变量名1, 变量名2 变量类型 仅声明变量不赋值会自动赋予变量默认值

  1. 数值类型(包括complex64/128)为 0
  2. 布尔类型为 false
  3. 字符串为 ""(空字符串)
  4. 其他派生型为nil
package main

import "fmt"

func main() {
	var v1 bool
	var v2, v3 int
	fmt.Println(v1,v2,v3)
}

输出

false 0 0

赋值

变量赋值直接使用=即可,各大语言都一样不过多赘述

package main

import "fmt"

func main() {
	var v1 bool = true
	var v2, v3 int = 5, 8
	fmt.Println(v1, v2, v3)
}

输出

true 5 8

根据类型自动声明类型

直接使用var 变量名 = 值声明变量会根据值自动匹配变量类型

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var v1 = true
	var v2, v3 = 5, "8"
	fmt.Println(v1, v2, v3)
	fmt.Println(reflect.TypeOf(v1),reflect.TypeOf(v2),reflect.TypeOf(v3))
}

输出

true 5 8
bool int string

省略var,使用:=声明新的变量

例如:var 变量名 变量类型 = 值可以简写为变量名 := 值。但是需要注意的是,如果在:=前的变量名组没有任何一个是未声明过的变量会抛出异常

正常demo:

package main

import "fmt"

func main() {
	v1, v2, v3 := 1,"test",true
	fmt.Println(v1,v2,v3)
}

输出

1 test true

错误示范:

package main

func main() {
	var v1 string = "test"
	v1 := "abc"
}

抛出异常

# command-line-arguments
src\study\d01\main.go:5:5: no new variables on left side of :=

no new variables on left side of :=在:=左边没有任何新的变量

值类型和引用类型

和php一样,在普通的赋值=中是值传递,值传递时会开辟一个新的内存空间指向一个新的内存地址。而有的时候会需要引用一个变量的内存地址而不是深层拷贝这个变量的整个内存,这个时候会使用&=。 这一部分也不详细说明了,但是鉴于经常有PHP萌新提出相关的问题,这里我搬一下给PHPER解释时画的图解释一下传值和引用:

注意事项

如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。(上面已经演示过了)

如果你在定义变量 a 之前使用它,则会得到编译错误 undefined: a

如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,a declared and not used 即a被声明了但是没有被使用

关于局部变量和全局变量

在函数内部声明的变量为局部变量,在函数外声明的变量为全局变量:

package main

import "fmt"

var a int // 全局变量

func main() {
	var v1 string = "test" // 局部变量
	fmt.Println(v1)
}

上面的代码虽然a没有被使用,但是因为是全局变量,所以不会编译失败

特殊的标示_

_会接收但不使用变量,在某些特殊的情况中会使用,例如后面会讲到循环一个数组

package main

import "fmt"

func main() {
	var m1 = [5]int{1, 2, 3, 4, 5} // 一个5个int成员的数组
	for k, v := range m1 { // 使用range会返回key和value,使用k,v分别接受key和value
		fmt.Println(k,v)
	}
	// 但是上述方法中,如果不想使用key的话,可以选择使用 _ 接收。还记得为什么不能留下k但不使用吗?因为会编译出错k declared and not used :k被声明了但未使用
	// 这样就可以做到不接收k了
	for _, v := range m1 {
		fmt.Println(v)
	}
}

总结

入门思维导图下载(使用xmind打开):golang.xmind

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论