变量
作用域:
在一个函数中使用某一变量会先在该作用域中寻找,如果没有会在上一层作用域中寻找,以此类推,如果全都没有则报错;
go语言中推荐使用小驼峰式命名(首字母小写,首字母之后的单词首字母大写);
同一个作用域内({})不能重复声明变量;
go语言必须先声明再使用,go是静态类型语言,变量类型声明之后不可改变,,且声明的变量必须使用;
变量可以声明为全局变量和局部变量,在函数外声明为全局变量,函数内声明为局部变量;
go语言无法直接定义二进制数
变量分类
- 整型
int(不同操作系统下大小不一样,32位CPU就是4个字节,如果是64位就是8个字节)、int8、int16、int32、int64
package main
import "fmt"
// %v 只输出所有的值
// %+v 先输出字段类型,再输出该字段的值
// %#v 先输出结构体名字值,再输出结构体(字段类型+字段的值)
func main(){
// 十进制以不同的进制展示
var a int = 10
fmt.Printf("%b \n", a) // 1010 占位符%b表示二进制
fmt.Printf("%o \n", a) // 12 占位符%o表示八进制
fmt.Printf("%d \n", a) // 10 占位符%d表示十进制
fmt.Printf("0x%x \n", a) // 0xa 占位符%x表示十六进制
//b:=(int8)5,可以声明为int8类型的变量
// 八进制(以0开头)
var b int = 077
fmt.Printf("%b \n", b) // 111111
fmt.Printf("%o \n", b) // 77
fmt.Printf("%d \n", b) // 63
fmt.Printf("0x%x \n", b) // 0x3f
// 十六进制(以0x开头)
var c int = 0xff
fmt.Printf("0x%x \n", c) // 0xff
fmt.Printf("0X%X \n", c) // 0xFF
// 数字字面量语法(Number literals syntax)
binary := 0b1111
octal := 0o17
digital := 15
hexadecimal := 0xf
specialhexa := 0x8p-2 // 8 / 2^2 = 2
underline := 10_24
fmt.Printf("binary : %b , digital : %d\n", binary, binary)
fmt.Printf("octal : %o , digital : %d\n", octal, octal)
fmt.Printf("digital type (变量类型): %T,digital : %d\n", digital, digital)
fmt.Printf("hexadecimal : %x, digital : %d, specialhexa : %f\n", hexadecimal, hexadecimal, specialhexa)
fmt.Printf("underline : %d \n", underline)
}
-
string
在go中只能用双引号进行表示,单引号为字符,字符串不可修改;
一个字符’a’为一个字节(uint8),一个utf8编码的汉字字符为3个字节(是rune类型,golang中string底层是通过byte数组实现的,中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而Go语言默认使用UTF-8编码),len()求的是字节的数量,byte 等同于int8,常用来处理ascii字符,rune 等同于int32,常用来处理unicode或utf-8字符;
(Unicode 是「字符集」 UTF-8 是「编码规则」)
反引号:
反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出;
s1 := `第一行
第二行
第三行
`
s2 := `c:\weiyigeek\go\hello` // 注意点此处没用转义符(\) 也能输出路径
fmt.Println(s1,s2)
//字符串的修改
s2 := "白萝卜"
s3 = []rune(s2)
s3[0] = '红'
s4 = string(s3)
-
bool
布尔值在go语言中默认为false,不允许将整型强转为布尔型,布尔值无法参与数值运算,也无法与其他类型进行转换
-
uint(不同操作系统下大小不一样)、uint8、uint16、uint32、uint64、uintptr(无符号整型,用于存放一个指针)
-
byte // uint8 的别名
-
rune // int32 的别名 代表一个 Unicode 码
-
float32、float64 //go中默认为float64
-
complex64、complex128
定义方式
var 变量名 变量类型
//法一
var a int
a = 1
//法二
var a int = 1 //不建议,因为本身可以进行类型推导
//法三
var a = int32(1)//强制类型转换
//法四
a := int32(1)
var b string
var c,d int
var{
a string
b int
c []float32
d func() bool
e struct {
x int
}
}
简短模式(short variable declaration):
除 var 关键字外,还可使用更加简短的变量定义和初始化语法。
名字 := 表达式
需要注意的是,简短模式(short variable declaration)有以下限制:
- 定义变量,同时显式初始化。
- 不能提供数据类型。
- 只能用在函数内部。
func main() {
x:=100
a,s:=1, "abc"
}
因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。
匿名变量:
func foo(){
return 10,"123"
}
func main(){
_, a = foo()
a, _ = foo()
}
在多重赋值的时候,如果要想忽略某个值可以使用匿名变量接收要忽略的值,匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。
常量
定义之后不允许修改
const pi = 3.1415
const (
n1 = 10
n2 //如果某一行没有写值,则该行变量的值和上一行是一样的
n3 = "123"
)
iota
iota是go的常量计数器,只能在常量的表达式中使用,在const关键字出现时将被置为0,const中每新增一行常量声明将使iota计数一次(iota相当于const语句块中的行索引),使用iota可以简化定义,在定义枚举的时候很有用;
注:不同const语句块中iota会重新置数
const(
n1 = iota //0
n2 //1
n3 //2
_ // _ 会占位
n4 //4
n5 = 100 //100
n6 //6
)
const(
d1, d2 = iota +1, iota+2 //d1 = 1,d2 = 2
d3, d4 = iota +1, iota+2 //d3 = 2,d4 = 3
)//只有在新增一行的时候iota才会加1
//定义数量级
const(
_ = iota
kb = 1 << (10 * iota) //1左移十位为2^10
mb = 1 << (10 * iota)
gb = 1 << (10 * iota)
tb = 1 << (10 * iota)
)