var关键字声明变量 使用 var 关键字
这是最基本的变量声明方式
var x = 100
var y string = "hello"
var z bool // 默认零值 为 false
var w //错误 go是强类型语言声明必须确定类型 w不能推断出来类型,并且没有给定具体类型。
var t int = "hello" //错误,推到类型和声明类型不匹配
var t int // 错误,t 已经被定义,可以直接使用 不能在定义
var v = nil // nil没有类型,不能用于类型推断
使用 var 关键字同时声明多个变量
var (
a int = 10
b string = "world"
c bool = true
)
类型推断
var a = 100
此变量没有声明类型。由右边的值进行推断
go语言不允许只声明一个变量。不对该变量定义类型并且不赋值,会提示期待一个类型的错误
使用短变量声明(:=)
当你在函数内部声明局部变量时(此声明方式不能再全局使用),可以使用 := 操作符,这种方式会自动推断变量的类型。自动类型推断不能写var 声明,和自定义变量
x := 10 // 推断 x 为 int 类型
y := "hello" // 推断 y 为 string 类型
一行声明多个变量
var x,y = 10,"hello"
X, Y := 10 ,"hello"
const 关键字声明常量 常量在程序运行时不会被修改。
数组类型不能声明为常量
在有iota的常量组中,iota在常量声明的第一行以0开始,每换一行iota都会自增1
const PI float64 = 3.1415926
const (
StatusOK = 200
StatusError = 500
)
const (
A = 10 //常量组中的常量值是不可修改的 此行iota=0
B //如果常量组中的常量没有赋值,那么它的值继承上一个赋值表达式 此行iota=1
C = 1 << iota //在有iota的常量组中,iota在常量声明的第一行以0开始,每换一行iota都会自增1.此行iota=2
D //此行 继承上一行表达式为1 << iota 换行后iota自增1 此行iota=3
)
// A=10 B=10 C=4 D=8
匿名变量
GO语言中变量必须要声明之后才能使用,同一作用域内不支持重复声明。 并且Go语言的变量声明后必须使用。
匿名变量通常在函数的多值返回中被使用,当你不想使用某个返回值时,可以使用匿名变量。匿名变量用一个下划线_表示。
package main
import "fmt"
func funcExample() (int, string) {
return 42, "Hello, World!"
}
func main() {
_, msg := funcExample() // 使用匿名变量忽略第一个返回值
fmt.Println(msg) // 输出: Hello, World!
}
标识符命名规则
以字母开头:标识符必须以字母(a-z、A-Z)或下划线(_)开头。
后续字符:标识符的后续字符可以是字母、下划线或数字(0-9)。
大小写敏感:Go是区分大小写的编程语言,因此大小写字母被视为不同的字符。
标点符号限制:Go不允许在标识符中使用除了下划线之外的任何标点符号,例如@、$、%等。
避免关键字:应避免使用Go编程语言中的关键字作为标识符,以免与语言的语法和功能产生冲突。
避免使用下图出现的名字为命名标识符
go语言分 以换行和分号为分隔符。 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号;结尾,因为这些工作都将由 Go 编译器自动完成,如果你打算将多个语句写在同一行,它们则必须使用;人为区分,但在实际开发中我们并不鼓励这种做法。
进制及转换 十进制:人类生活中使用的计数方式,基数为10,使用0到9的十个数字。 二进制:基数为2,使用0和1两个数字。在计算机中,数据都是以二进制形式存储的。
八进制:基数为8,使用0到7八个数字。
十六进制:基数为16,使用0到9和A到F(或a到f)十六个字符。
十进制转二进制 (1)十进制转二进制的转换原理:除以2,反向取余数,直到商为0终止。 (2)具体做法:
将某个十进制数除2得到的整数部分保留,作为第二次除2时的被除数,得到的余数依次记下,重复上述步骤,直到整数部分为0就结束,将所有得到的余数最终逆序输出,则为该十进制对应的二进制数。
二进制转十进制
二进制数转换成十进制数,需将二进制数的各位数码与它们的权相乘,再把乘积相加,就得到对应的十进制数,该方法称为按权展开相加法。
整数
浮点数
float32类型占用32位,用于表示单精度浮点数,其范围为-3.4E38到3.4E38,
float64类型占用64位内存,用于表示双精度浮点数,其范围为-1.7E308到1.7E308。
float32:其中符号位数 : 1位, 指数位数 : 8位,指数范围 : -127 ~ +128 有效数字(尾数位) : 23位,有效数字范围:2^23=8388608 即float的精度为6~7位有效数字,最多能有7位有效数字,但绝对能保证的为6位
float64
float64:其中符号位数 : 1位, 指数位数 : 11位,指数范围 : -1023~+1024 有效数字(尾数位) : 52位,有效数字范围:2^52=4503599627370496 即float的精度为15~16位有效数字,最多能有16位有效数字,但绝对能保证的为15位
结果 2e+10 float64
使用科学计数法的整数,在go语言中也为浮点数
bool类型 布尔类型是基本数据类型之一,只有两个值:true和false。代表逻辑判断中的真和假,在go中,不能和其他类型互相转换
字符串类型 字符串类型用于存储文本信息,表示为string,在go中属于基本数据类型。在内存中是一段连续的存储空间。字符串在Go中采用UTF-8编码,并支持各种常见操作如拼接、切割、查找等(在后边会详细讲解)
格式化输出 fmt.Printf 允许使用格式化动词来格式化输出
fmt.Printf("Name: %s, Age: %d\n", "Alice", 30) // 输出: Name: Alice, Age: 30
在格式化字符串中,你可以使用不同的格式化动词来控制输出的格式,例如:
%d:十进制整数。
%s:字符串。
%q:字符字面值,使用Go语法,字符使用单引号包裹,字符串使用双引号包裹。
%f:浮点数(例如:3.141592653589793)。
%x:十六进制整数,字母形式为小写(例如:1a)。使用%X则大写(例如:1A)。
%b:二进制表示。
%o:八进制表示。
%c:Unicode 码点对应的字符。
%t:布尔值。
%v:默认格式表示,可以是任何类型的值。对于字符串,它与%s相同;对于整数,它与%d相同等等。对于结构体等复杂类型,可以使用%+v以更易读的形式打印(包括字段名和值)。还可以使用%#v以Go语法表示。
%p:指针的地址。例如,对于指针变量,它将输出变量的内存地址。例如:0xc0000180b8。
%#v可以打印变量的Go语法表示形式。
格式化输出进阶 宽度和精度控制用于调整输出格式:
宽度: 数字前的整数,用于指定最小宽度。
精度: . 后的数字,用于指定浮点数的小数位数或字符串的最大长度。
例子:
fmt.Printf("'%6d\n'", 123) // 输出: ' 123'
fmt.Printf("'%6.2f\n'", 1.2) // 输出: ' 1.20'
fmt.Printf("'%.2s\n'", "abcdef") // 输出: 'ab'
[arg索引]
“arg索引”由中括号和 arg 序号组成,用于指定当前要处理的 arg 的序号,序号从 1 开始
第一个打印是300,
第二个序号是3,序号从1开始,序号3是300.
第三个没写序号,从上一个打印的序号开始递增,所以第三个序号是4,打印400.
第四个写了序号2.所以打印200
零值 变量已经被声明,但是未被显示初始化,这时候,编译器会给我们初始化成零值
类型推导
强制类型转换
go语言是强类型的,同是数据类型,长度不一样。依然不能相加。此时,我们需要使用强制类型转换。
例如上图,需要改成 c = int64(a) + b
注意:
当从一个取值范围较大的类型转换到取值范围较小的类型时(将int32转换为int16或将float32转换为int),会发生精度丢失(截断)的情况。
强制类型转换,需要注意,数字转字符串,在go中会转换成他对应的Unicode编码
只有相同底层类型的变量之间可以进行相互转换(如将int16类型转换成int32类型),不同底层类型的变量相互转换时会引发编译错误(如将bool互转为其他类型)(string互转为float类型)(string转为int类型)。
其他语言中布尔类型bool变量转换为整型int变量,通常采用 “0为假,非0为真”的方式,但是这个方式在Go语言中行不通。go语言中 bool类型不能转换为int int整型也不能转换为bool
浮点型不能转换成字符
例如 f := string(63.5) //报错 string类型 和 bool 和 float类型不能相互强转
隐式类型转换
字面数字 123 。会被类型推导为int类型。 我们用一个int32 的类型去接受。按照go强类型语言的规定,是不能这样做的。这里go编译器为我们做了隐式类型转换,相当于 int32(123)
rune类型
rune 是 int32的别名。
下图是go函数为我们内建的几个变量的别名
type 声明时候 使用了 = 相当于给这个 名称起了个别名。在类型判断时候,还是指向原类型
特别注意: 如果不加 = 。说明我们声明了一个新的类型 和 原来int32就不属于同一个类型了
我们自定义类型并不能和 int32 直接相加,需要强转下int32才可以相加
rune 保存的是字符的unicode码