Golang全栈开发----Golang基础知识
第一章 基础语法
1. 注释
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是开发人员一个非常重要的习惯,也是专业的一种表现。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。
单行注释:ctrl + / (Goland)
多行注释:ctrl +shift +/ (Goland)
2.变量
在计算机编程中,我们用变量来保存并管理很多数据,并用变量名来区分、识别和处理这些数据。
变量本质上是一种对内存地址的引用,让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字进行操作。
有了变量,我们就可以将存储的数据反复操作
// 声明并赋值 var num1 = 1 var num2 = 2 fmt.Println(num1 + num2) // 如果计算结果程序下面会用到可以赋值 // 计算num1和num2其他运算值 fmt.Println(num1 * num2) fmt.Println(num1 / num2) fmt.Println(num1 - num2)
(1)声明变量
和C语言一样,Go语言也是通过var关键字进行声明,不同的是变量名放在类型前,具体格式如下
var 变量名 变量类型
不赋值,默认值 var x int var s string var b bool fmt.Println(x) // 0 fmt.Println(s) // "" fmt.Println(b) // false
如果声明多个变量,可以进行简写
// 声明多个相同类型变量 var x,y int // 声明多个不同类型变量 var ( name string age int isMarried bool )
变量赋值的3种方法
变量名=值
// 先声明再赋值 var x int x = 10 // 不要 重复声明 : var x = 10 fmt.Println(x) x = 20 // 重新赋值 // 直接声明赋值 // var y string= "hello sanqiansi!" var y = "hello sanqiansi!" fmt.Println(y) // 声明赋值精简版 s := "hi,sanqiansi!" // 1、编译器会自动根据右值类型推断出左值的对应类型,等同于var s = "hi,sanqiansi!"。2、该变量之前不能声明,否则重复声明 fmt.Println(s) // 一行声明赋值多个变量 var name,age = "sanqiansi",22
变量名=值 + 值 (变量名)
var a, b = 10, 20 var c = a + b fmt.Println(c) var d = c + 100 fmt.Println(d)
变量名=变量名
var a = 100 var b = a // 变量之间的赋值是值拷贝 fmt.Println(a, b) a = 200 fmt.Println(b)
将两个变量的值进行交换
var num1 = 100 var num2 = 200 num1, num2 = num2, num1 fmt.Println(num1, num2) //200 100
a,b,c :=4,5,6 fmt.Println(a,b,c) // 如果只想接受第个变量,可以对前两个变量匿名 _,_,x := 4,5,6 fmt.Println(x)
让代码非常清晰,基本上屏蔽掉了可能混淆代码阅读者视线的内容,从而大幅降低沟通的复杂度和代码维护的难度。
变量命名是需要遵循一定的语法规范的,否则编译器不会通过。
1、变量名称必须由数字、字母、下划线组成。
2、标识符开头不能是数字。
3、标识符不能是保留字和关键字。
4、建议使用驼峰式命名,当名字有几个单词组成的时优先使用大小写分隔
5、变量名尽量做到见名知意。
6、变量命名区分大小写
go语言中有25个关键字,不能用于自定义变量名
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var还有30多个预定义的名字,用于内建的常量、类型和函数
// 内建常量: true false iota nil // 内建类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error // 内建函数: make len cap new append copy close delete complex real imag panic recover程序中变量名命名不正确的是(多选) A true B _xyz C 2a D $abc 正确答案:B3. 语句分隔符
就像我们写作文一样,一定要有像逗号或者句号这样的语句分隔符,否则无法断句根本不能理解,编程语言也一样,需要给解释器或者编译器一个语句分割,让它知道哪里到哪里是一个语句,才能再去解析语句。
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分(不建议这样写)。
// var name = "yuan";var age = 18 // 不报错但是不推荐 // 推荐写法 var name = "yuan" // 换行即分隔符 var age = 18 fmt.Println(name) fmt.Println(age)4. 输入输出函数
(1)输出函数
Print: 输出到控制台,不接受任何格式化操作 Println: 输出到控制台并换行 Printf : 只可以打印出格式化的字符串,只可以直接输出字符串类型的变量(不可以输出别的类型) Sprintf:格式化并返回一个字符串而不带任何输出
Print 和Println
Print和Println()函数可以打印出字符串或变量的值。
name := "sanqiansi" age := 24 fmt.Print(name, age) fmt.Println("hello world") fmt.Println(name) fmt.Println(age) fmt.Println(name, age) fmt.Println("姓名:", name, "年龄:", age)格式化输出(Printf)
Printf 根据格式说明符格式化并写入标准输出。Printf 只打印字符串
比如上面打印一个人的基本信息格式:
name := "sanqiansi" age := 24 isMarried := false salary := 3000.549 fmt.Printf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary) fmt.Printf("姓名:%v 年龄:%v 婚否:%v 薪资:%v\n", name, age, isMarried, salary) fmt.Printf("姓名:%#v 年龄:%#v 婚否:%#v 薪资:%#v\n", name, age, isMarried, salary)%v:以默认的方式打印变量的值 %#v:相应值的Go语法表示 %T:打印对应值的类型 %+d :带符号的整型, %d :不带符号的整型 %o :不带零的八进制, %#o: 带零的八进制 %x :小写的十六进制, %X: 大写的十六进制, %#x: 带0x的十六进制 %b :打印整型的二进制 %t :打印true 或 false %s :输出字符串表示, %-5s: 最小宽度为5(左对齐) %f: 小数点而无指数,默认精度为6 %e: 科学计数法,如-1234.456e+78 %p: 带0x的指针, %#p: 不带0x的指针// 整形和浮点型 fmt.Printf("%b\n", 12) // 二进制表示:1100 fmt.Printf("%d\n", 12) // 十进制表示:12 fmt.Printf("%o\n", 12) // 八进制表示:14 fmt.Printf("%x\n", 12) // 十六进制表示:c fmt.Printf("%X\n", 12) // 十六进制表示:c fmt.Printf("%f\n", 3.1415) // 有小数点而无指数:3.141500 fmt.Printf("%.3f\n", 3.1415) // 3.142 fmt.Printf("%e\n", 1000.25) // 科学计数法: 1.000250e+03,默认精度为6 // 设置宽度 fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1001", "aoteman", 100) fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1002", "sanqiansi", 98) fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1003", "x", 78)Sprintf
Printf和Sprintf都是替换字符串,Printf是直接输出到终端,Sprintf是不直接输出到终端,而是返回该字符串
name := "sanqiansi" age := 24 isMarried := false salary := 3000.549 info := fmt.Sprintf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary) fmt.Println(info)(2)输入函数
go语言fmt包下有三个函数,可以在程序运行过程中从标准输入获取用户的输入:
(1)fmt.Scan
语法:
func Scan(a ...interface{}) (n int, err error)
本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
package main import "fmt" func main() { var ( name string age int isMarried bool ) fmt.Scan(&name, &age, &isMarried) // 输入类型不一致,按默认值 fmt.Printf("扫描结果 name:%s age:%d married:%t\t", name, age, isMarried) }将上述代码在终端运行,在终端依次输入 sanqiansi、26、false使用空格分隔。
go run main.go sanqiansi 26 false 扫描结果 name:yuan age:26 married:falsefmt.Scan从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数中。
(2)fmt.Scanf
func Scanf(format string, a ...interface{})(n int, err error)
本函数返回成功扫描的数据个数和遇到的任何错误。
// 案例1 var ( name string age int isMarried bool ) fmt.Scanf("1:%s 2:%d 3:%t", &name,&age,&isMarried) fmt.Printf("扫描结果 姓名:%s 年龄:%d 婚否:%t", name,age,isMarried) // 案例2 var a, b int fmt.Scanf("%d+%d", &a, &b) fmt.Println(a + b)(3)fmt.Scanln
语法
func Scanln(a ...interface{}) (n int, err error)
Scanln类似于Scan,它遇到换行立即停止扫描。
本函数返回成功扫描的数据个数和遇到的任何错误。
Scanln和Scan的区别就是Scanln遇到换行立即结束输入,而Scan则会将换行符作为一个空白符继续下一个输入