目录
1 注释
go的注释分为单行注释和多行注释
单行注释://内容
多行注释:/*内容*/
2 变量
2.1 声明变量
# 声明变量的格式
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
)
2.2 变量赋值
新变量赋值
## 先声明再赋值:不能多次声明,可以多次赋值
var x int
x = 10
fmt.Println(x)
x = 20 // 重新赋值
## 声明并赋值:
var y string= "hello world!"
var y = "hello world!" //不指定数据类型编译器会自己识别
fmt.Println(y)
## 声明并赋值精简版:
s := "hello world!"
fmt.Println(s)
// 1、编译器会自动根据右值类型推断出左值的对应类型,等同于var s = "hello world!"。
// 2、该变量之前不能声明,否则重复声明
// 3、这种声明方式只能在函数内
## 同时声明赋值多个变量
var name,age = "shuaibi",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)
2.3 匿名变量
匿名变量即没有命名的变量,在使用多重赋值时,如果想要忽略某个值,可以使用,通过一个_下划线表示
var _, b = 1, 2
fmt.Println(b)
// 匿名函数常用于调用函数后将某个返回值抛弃,不进行接受和二次使用时,就可以使用
2.4 GO语言中的变量名命规范
变量名需要遵循规范,不然编译时会报错
1、变量名称必须由数字、字母、下划线组成。
2、标识符开头不能是数字。
3、标识符不能是保留字和关键字。
4、建议使用驼峰式命名,当名字有几个单词组成的时优先使用大小写分隔
5、变量名尽量做到见名知意。
6、变量命名区分大小写
自定义变量时不可以使用关键字
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
// 关键字是已经有特殊含义和功能的单词,不可以用作自定义变量名字
预定义的名字用于内建的常量、类型和函数,也不可使用
// 内建常量:
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
3 语句分割符
程序中让编译器和解释器识别断句通过换行,一行一个语句,不需要像c一样写分号
// 推荐写法
var name = "yuan" // 换行即分隔符
var age = 18
fmt.Println(name)
fmt.Println(age)
// var name = "yuan";var age = 18 // 不报错但是不推荐
4 输入输出函数
4.1 输出函数
fmt.Print`有几个变种:
Print: 输出到控制台,不接受任何格式化操作
Println: 输出到控制台并换行
Printf : 只可以打印出格式化的字符串,只可以直接输出字符串类型的变量(不可以输出别的类型)
Sprintf:格式化并返回一个字符串而不带任何输出
print和println
// println打印后会同时换行
fmt.Println("hello world")
// print打印后会同时换行
fmt.Print("hello world")
printf
// 在打印时通过占位符将变量和字符串进行拼接打印,不同类型的变量有不同的占位符
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", "alvin", 100)
fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1002", "zuibangdeyuanlaoshi", 98)
fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1003", "x", 78)
Sprintf
// Printf和Sprintf都是替换字符串,Printf是直接输出到终端,Sprintf是不直接输出到终端,而是返回该字符串,相当于return
info := fmt.Sprintf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary)
fmt.Println(info)
4.2 输入函数
go语言fmt包下有三个函数,可以在程序运行过程中从标准输入获取用户的输入
fmt.scan
## 函数源码语法:接受一个不定长的接口类型的参数,返回两个值
func Scan(a ...interface{}) (n int, err error)
## Scan 从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
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)
}
fmt.scanf
## 函数源码语法:接受两个参数,返回两个值
func Scanf(format string, a ...interface{})(n int, err error)
## Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。本函数返回成功扫描的数据个数和遇到的任何错误。
package main
import "fmt"
func main() {
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)
}
// 输入内容:输入的内容要符合规定的数据类型,并且以空格分隔
1:liduole 2:23 3:true
扫描结果 姓名:liduole 年龄:23 婚否:true
## 例如需要做个计算器,需要将两个关键数据用变量接收,还需要其他内容补充
var a, b int
fmt.Scanf("%d+%d", &a, &b)
fmt.Println(a + b)
fmt.scanln
## 函数源码语法:接受一个不定长的接口类型的参数,返回两个值
func Scanln(a ...interface{}) (n int, err error)
## Scanln类似于Scan,它遇到换行立即停止扫描。本函数返回成功扫描的数据个数和遇到的任何错误。