第一个go程序和基本语法
第一个go程序和基本语法
一. 第一个go程序
//package 声明开头表示代码所属包 package main //导入格式化包,引了必须用 import "fmt" //左括号{不能单起一行 func main(){ fmt.Println("Go Lang, 开始浪吧~") } // "//"表示单行注释 // "*/ */"表示多行注释
二. 基础语法
1. 命名
-
go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则
-
一个名字必须以一个字母或下划线开头,后面可以跟任意数量的字母、数字或下划线
-
go区分大小写,hello和Hello不一样
-
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
2. 变量
2.1 声明变量:
//package 声明开头表示代码所属包 package main import "fmt" func main() { //第一种: var v1 int var v2 int //第二种: var v3, v4 int //第三种 var( v5 int v6 int ) //零值 fmt.Println(v1, v2, v3, v4, v5, v6) }
2.2 变量初始化
//package 声明开头表示代码所属包 package main import ( "fmt" "reflect" ) func main() { //方式一: var v1 int = 10 //方式二:go编译器自动推到出变量类型 var v2 = 20 //方式三:声明加赋值, 必须在函数里面用 v3 := 30 fmt.Println(v1, v2, v3) //利用反射查看变量类型 fmt.Println("v3的类型是", reflect.TypeOf(v3)) } //10 20 30 //v3的类型是 int
2.3 变量赋值
//package 声明开头表示代码所属包 package main import "fmt" func main() { //1. 直接赋值 var v1 int v1 = 123 //2. 声明并赋值 i := 10 j :=20 //3. 多重赋值 var v2, v3, v4 int v2, v3, v4 = 1, 2, 3 fmt.Println(v1, v2, v3, v4, i, j) }
匿名变量:
//package 声明开头表示代码所属包 package main import "fmt" //(int, sting): 返回值类型 func test()(int, string){ return 666,"浪不浪" } func main() { // "_"是特殊变量, 占位 _, s1 := test() fmt.Println(s1) a1, s1 := test() fmt.Println(a1,s1) } //浪不浪 //666 浪不浪
.
//package 声明开头表示代码所属包 package main import "fmt" var abc = 456 func main() { //定义 var a int var s string fmt.Println(a,s) fmt.Printf("%d %q\n", a,s) //定义多个 var c,b int = 3,4 fmt.Println(c,b) //不指定类型定义, 可以写一行 j,k,q :=3,true,"xx" fmt.Println(j,k,q) } //0 //0 "" //3 4 //3 true xx
3 常量与枚举
//package 声明开头表示代码所属包 package main import "fmt" //常量 const const filename = "luhan.txt" ////常量必须是可确定的数字, 字符串, 布尔值 //var a = "haha" //const file2 = a //定义函数, 函数内写常量 func consts() { //多个常量 const ( XX = "haha1" OO = "haha2" filename = "haha3" ) fmt.Println(XX, OO, filename) } //1. 定义枚举类型 func enums() { const ( python = 0 java = 1 golang = 2 ) fmt.Println(python, java, golang) } //2. 自增的枚举类型 func enums1() { const ( //iota关键字是自增 pyhton = iota java golang ) fmt.Println(pyhton, java, golang) } //3. iota还可以参与计算 func enums2() { const ( //位运算, n*2(10*1), 2^0 = 1 b = 1 << (10 * iota) kb mb gb tb pb ) fmt.Println(b, kb, mb, gb, tb, pb ) } func main() { consts() enums1() enums2() } //haha1 haha2 haha3 //0 1 2 //1 1024 1048576 1073741824 1099511627776 1125899906842624
4. 数据类型
- u开头是无符号类型
- 8,16,32这些,最大最用是增加可移植性和维护性
-
short int long
类型名称 有无符号 bit数 int8 Yes 8 int16 Yes 16 int32 Yes 32 int64 Yes 64 uint8 No 8 uint16 No 16 uint32 No 32 uint64 No 64 int Yes 等于cpu位数 uint No 等于cpu位数 rune Yes 与 int32 等价 byte No 与 uint8 等价 uintptr No -
.
//package 声明开头表示代码所属包 package main import ( "fmt" "reflect" ) func main() { //1.整型 var v1 int32 v1 = 123 v2 := 64 fmt.Println(v1,v2) //默认是int fmt.Println(reflect.TypeOf(v2)) //2.浮点型 var f1 float32 f1 = 12 fmt.Println(f1) f2 := 12.0 fmt.Println(reflect.TypeOf(f2)) //3.布尔型 var b1 bool b1 = true fmt.Println(b1) b2 := (1==2) //打印类型 fmt.Println(reflect.TypeOf(b2)) //4.字符型 var ch byte ch = 'a' fmt.Println(ch) fmt.Printf("ch = %c",ch) //5.字符串 var str string str = "luhan" s := str[0] fmt.Println(s) //反括号圈起来的字符串,原样输出 str2 := `hello luhan \n \r xx ` fmt.Println("str2=",str2) } //123 64 //int //12 //float64 //true //bool //97 //ch = a108 //str2= hello //luhan \n \r xx
5. fmt包的使用
输出:
//package 声明开头表示代码所属包 package main import "fmt" func main() { //整型 a := 15 //%b:二进制 fmt.Printf("a = %b\n",a) //只输出一个% fmt.Printf("%%\n") //字符 ch := 'a' fmt.Printf("ch = %c,%d\n",ch,97) //浮点 f := 3.14 //%g紧凑方式输出 fmt.Printf("f = %f,%g\n",f,f) //布尔型 fmt.Printf("%t,%t\n",true,false) //字符串 str := "hello.go" fmt.Printf("str = %s\n",str) } //a = 1111 //% //ch = a,97 //f = 3.140000,3.14 //true,false //str = hello.go
输入:
//package 声明开头表示代码所属包 package main import "fmt" func main() { //用户输入内容, 程序接收 var v int //Print是不回车 fmt.Print("请输入一个整型:") //直接输入 //如果不是int,输出零值 fmt.Scan(&v) fmt.Println(v) } //请输入一个整型:5 //5
6. 类型别名
//package 声明开头表示代码所属包 package main import ( "fmt" "reflect" ) func main() { //type关键字定义别名 type myint int var i myint = 100 fmt.Println(i) fmt.Println(reflect.TypeOf(i)) } //100 //main.myint
7. 类型转换
go类型转换不允许隐式转换
//package 声明开头表示代码所属包 package main import "fmt" func main() { var ch byte = 'a' var i int = int(ch) fmt.Println(ch) fmt.Println(i) } //97 //97
8. 运算符
-
算术运算符
+ 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相乘 A * B 输出结果 200 / 相除 B / A 输出结果 2 % 求余 B % A 输出结果 0 ++ 自增 A++ 输出结果 11 -- 自减 A-- 输出结果 9
-
关系运算符
== 检查两个值是否相等,如果相等返回 True 否则返回 False。 (A == B) 为 False != 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 (A != B) 为 True > 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 (A > B) 为 False < 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 (A < B) 为 True >= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 (A >= B) 为 False <= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 (A <= B) 为 True
-
逻辑运算符
&& 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 (A && B) 为 False || 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 (A || B) 为 True ! 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 !(A && B) 为 True
-
位运算符
& 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 (A & B) 结果为 12, 二进制为 0000 1100 | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 (A | B) 结果为 61, 二进制为 0011 1101 ^ 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (A ^ B) 结果为 49, 二进制为 0011 0001 << 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 A << 2 结果为 240 ,二进制为 1111 0000 >> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为
-
赋值运算符
= 简单的赋值运算符,将一个表达式的值赋给一个左值 C = A + B 将 A + B 表达式结果赋值给 C += 相加后再赋值 C += A 等于 C = C + A -= 相减后再赋值 C -= A 等于 C = C - A *= 相乘后再赋值 C *= A 等于 C = C * A /= 相除后再赋值 C /= A 等于 C = C / A %= 求余后再赋值 C %= A 等于 C = C % A <<= 左移后赋值 C <<= 2 等于 C = C << 2 >>= 右移后赋值 C >>= 2 等于 C = C >> 2 &= 按位与后赋值 C &= 2 等于 C = C & 2 ^= 按位异或后赋值 C ^= 2 等于 C = C ^ 2 |= 按位或后赋值 C |= 2 等于 C = C | 2
-
其他
& 返回变量存储地址 &a; 将给出变量的实际地址。 * 指针变量。 *a; 是一个指针变量