go基础语法

61 阅读9分钟

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没有类型,不能用于类型推断

image.png

使用 var 关键字同时声明多个变量

var (

a int = 10

b string = "world"

c bool = true

)

类型推断

var a = 100

此变量没有声明类型。由右边的值进行推断

go语言不允许只声明一个变量。不对该变量定义类型并且不赋值,会提示期待一个类型的错误

image.png

使用短变量声明(:=)

当你在函数内部声明局部变量时(此声明方式不能再全局使用),可以使用 := 操作符,这种方式会自动推断变量的类型。自动类型推断不能写var 声明,和自定义变量

x := 10 // 推断 x 为 int 类型

y := "hello" // 推断 y 为 string 类型

一行声明多个变量

var x,y = 10,"hello"

X, Y := 10 ,"hello"

const 关键字声明常量 常量在程序运行时不会被修改。

数组类型不能声明为常量

image.png

在有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编程语言中的关键字作为标识符,以免与语言的语法和功能产生冲突。

避免使用下图出现的名字为命名标识符

image.png

go语言分 以换行和分号为分隔符。 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号;结尾,因为这些工作都将由 Go 编译器自动完成,如果你打算将多个语句写在同一行,它们则必须使用;人为区分,但在实际开发中我们并不鼓励这种做法。

image.png

进制及转换 十进制:人类生活中使用的计数方式,基数为10,使用0到9的十个数字。 二进制:基数为2,使用0和1两个数字。在计算机中,数据都是以二进制形式存储的。

八进制:基数为8,使用0到7八个数字。

十六进制:基数为16,使用0到9和A到F(或a到f)十六个字符。

十进制转二进制 (1)十进制转二进制的转换原理:除以2,反向取余数,直到商为0终止。 (2)具体做法:

将某个十进制数除2得到的整数部分保留,作为第二次除2时的被除数,得到的余数依次记下,重复上述步骤,直到整数部分为0就结束,将所有得到的余数最终逆序输出,则为该十进制对应的二进制数。

698eab992afac295766d6388d904a40c_4d7d5e1ad4d74d9e8b0308cf06d75ade.png 二进制转十进制 二进制数转换成十进制数,需将二进制数的各位数码与它们的权相乘,再把乘积相加,就得到对应的十进制数,该方法称为按权展开相加法。

18ff0eb1eced3fdf25f7a3316207d55f_39e66659e165499ba1c47dd02683807d.png 整数

bc2f7c46b8d976f9c8c3abcaa3fba7eb_40f18f180f424e9eb3346c411470ed50.png 浮点数 float32类型占用32位,用于表示单精度浮点数,其范围为-3.4E38到3.4E38,

float64类型占用64位内存,用于表示双精度浮点数,其范围为-1.7E308到1.7E308。

927384e5668875f191ea287d9208e822_ff5433c4008c406da9a55abd2b5ca2da.png float32:其中符号位数 : 1位, 指数位数 : 8位,指数范围 : -127 ~ +128 有效数字(尾数位) : 23位,有效数字范围:2^23=8388608 即float的精度为6~7位有效数字,最多能有7位有效数字,但绝对能保证的为6位

float64

e21d002a3dec94e645cbf0bc081db73a_207d7ba4b39e4781b1b29caf33a5e654.png

float64:其中符号位数 : 1位, 指数位数 : 11位,指数范围 : -1023~+1024 有效数字(尾数位) : 52位,有效数字范围:2^52=4503599627370496 即float的精度为15~16位有效数字,最多能有16位有效数字,但绝对能保证的为15位

0923b6f656a55331fb71bbd16713c858_d36eb54dce8b4781b2bd113bb7348500.png 结果 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 开始

e23322a1012699d10fc338077728bc12_ebd5adee8c4c4604a33550cc8337d1a2.png

第一个打印是300,

第二个序号是3,序号从1开始,序号3是300.

第三个没写序号,从上一个打印的序号开始递增,所以第三个序号是4,打印400.

第四个写了序号2.所以打印200

零值 变量已经被声明,但是未被显示初始化,这时候,编译器会给我们初始化成零值

4378ed387e0ac95c2a38a68aad51e991_d3c721ec7ea3439a844c4cf51e4590bf.png

类型推导

92671a848d40d9c5e153990e33e28173_7c5dd7f50aef443f80ef5a791ad98cbc.png

强制类型转换

6624a1e7fd8994f356460b8d5ea9c179_7bf8e30dca444c7eb7e4f2e948f13feb.png

go语言是强类型的,同是数据类型,长度不一样。依然不能相加。此时,我们需要使用强制类型转换。

例如上图,需要改成 c = int64(a) + b

注意:

当从一个取值范围较大的类型转换到取值范围较小的类型时(将int32转换为int16或将float32转换为int),会发生精度丢失(截断)的情况。

强制类型转换,需要注意,数字转字符串,在go中会转换成他对应的Unicode编码

9a113233521a828407d8bdd1d456ffca_c44297e6e7fc491ea2e75cafd7ee3e43.png

只有相同底层类型的变量之间可以进行相互转换(如将int16类型转换成int32类型),不同底层类型的变量相互转换时会引发编译错误(如将bool互转为其他类型)(string互转为float类型)(string转为int类型)。

其他语言中布尔类型bool变量转换为整型int变量,通常采用 “0为假,非0为真”的方式,但是这个方式在Go语言中行不通。go语言中 bool类型不能转换为int int整型也不能转换为bool

浮点型不能转换成字符

例如 f := string(63.5) //报错 string类型 和 bool 和 float类型不能相互强转

52ccc40a24f993793eb170c6c7c5e593_b11b21f00068445dbcb635e5185d292b.png 隐式类型转换 字面数字 123 。会被类型推导为int类型。 我们用一个int32 的类型去接受。按照go强类型语言的规定,是不能这样做的。这里go编译器为我们做了隐式类型转换,相当于 int32(123)

4e9757f5044229a464aedba4621b6bb4_6ca77504f07d41c0b39d04d1aebb2d12.png rune类型 rune 是 int32的别名。 下图是go函数为我们内建的几个变量的别名

0c7726201a24a9206c938b7f0c67c314_ae1406c2340248e08facfff23bc072dd.png

type 声明时候 使用了 = 相当于给这个 名称起了个别名。在类型判断时候,还是指向原类型

5d2d98426c5e12d2469c7447bfefba01_5e255fa896854778a69182120b633a83.png

特别注意: 如果不加 = 。说明我们声明了一个新的类型 和 原来int32就不属于同一个类型了

image.png

我们自定义类型并不能和 int32 直接相加,需要强转下int32才可以相加

rune 保存的是字符的unicode码

c4786ff59a654f803797bf8deeb5d1c5_bd817f58040342c0b6b4163a73b4d39f.png