Go语言
一个项目中运行多个main文件:run–>Edit Cofigurations…–>Run kind 选择File
Go语言基础语法
变量
helloword
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
定义变量
package main
import "fmt"
func main() {
var name string = "shengsan"
var (
age int
sex string
)
age = 18
sex = "男"
fmt.Println(name, age, sex)
}
语法糖定义变量
package main
import "fmt"
func main() {
name := "圣三"
age := 18
fmt.Println(name, age)
fmt.Printf("%T, %T", name, age) // %T 是类型的意思
}
打印内存地址
package main
import "fmt"
func main() {
var num int
num = 100
fmt.Printf("num:%d,内存地址:%p", num, &num) // & 取地址符
num = 200
fmt.Printf("num:%d,内存地址:%p", num, &num) // %p取地址 & 取地址符
// 地址一样
}
交换变量的值
package main
import "fmt"
func main() {
// 其他语言
// a = 10
//b = 200
//temp = 0
//temp = a
//a = b
//b = temp
// go 语言
var a int = 100
var b int = 200
b, a = a, b // 不需要中间变量,直接交换即可
fmt.Println(a, b)
}
匿名变量
package main
import "fmt"
func test() (int, int) {
return 100, 200
}
func main() {
a, _ := test() // _ 匿名变量,多次定义不会重复,里面的内容会直接被丢弃
fmt.Println(a)
}
变量作用域
-
局部变量可以和全局变量同名,但是运行的时候会有就近原则。
-
package main import "fmt" var name = "全局变量" func main() { name := "局部变量" fmt.Println(name) // 打印局部变量 test2() } func test2() { fmt.Println(name) // 打印全局变量 }
常量 const
package main
import "fmt"
func main() {
const URL string = "www.kuangstudy.com" // 显式定义
const URL2 = "www.kuangstudy.com" // 隐式定义
const a, b, c = 3.14, "shengsan", false //定义不同类型的多个变量
fmt.Println(URL)
fmt.Println(URL2)
fmt.Println(a, b, c)
}
特殊常量iota
-
iota,特殊常量,可以认为是一个可以被编译器修改的常量。iota是go语言的常量计数器
-
iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可以理解为const语句块中的索引)
-
package main import "fmt" func main() { const ( a = iota //iota = 0 b //iota = 1 c //iota = 2 d = "haha" //haha iota = 3 e //haha iota = 4 f = 100 //100 iota = 5 g //100 iota = 6 h = iota //iota = 7 i //iota = 8 ) const ( j = iota //iota = 0 k //iota = 1 ) fmt.Println(a, b, c, d, e, f, g, h, i, j, k) }
基本数据类型
bool类型(默认false)
-
%T 数据的类型 %t数据的值 \n 换行
-
package main import "fmt" func main() { // var 变量名 数据类型 // bool :true false // bool 默认类型 false var isFlag bool = true fmt.Println(isFlag) fmt.Printf("%T,%t\n", isFlag, isFlag) // %T 数据的类型 %t数据的值 \n 换行 }
数字型
-
int
-
float64默认打印六位小数
-
byte类似uint8 范围 0~255
-
package main import "fmt" // int // float64默认打印六位小数 // byte类似uint8 范围 0~255 func main() { // int var age int = 18 // float64 默认打印6位 var money float64 = 3.14 // byte 类似uint8 范围 0~255 var num = 20 fmt.Printf("%T,%d\n", age, age) // %d 数值类型 fmt.Printf("%T,%f\n", money, money) // %f 浮点类型 %.2f表示输出两位小数,但是会丢失精度 fmt.Printf("%T,%d\n", num, num) }
字符串
-
单引号:字符,整型-ASCII编码
-
编码表 ASCII编码
-
扩展
- 所有的中国字的编码表:GBK
- 全世界的编码表:Unicode编码表
-
package main import "fmt" func main() { var str string = "shengsan" fmt.Printf("%T,%s\n", str, str) // 单引号:字符,整型-ASCII编码 v1 := 'A' v2 := "A" // 扩展: // 所有的中国字的编码表:GBK // 全世界的编码表:Unicode编码表 fmt.Printf("%T,%d\n", v1, v1) // int32 65 fmt.Printf("%T,%s\n", v2, v2) // 字符串的拼接 + fmt.Println("hello" + "shengsan") // 转义字符 \ fmt.Println("hello\"shengsan") fmt.Println("hello\tshengsan") // \t制表符 }
数据类型转换
Go语言中不存在隐式类型转换,所有的类型转换都是显示的
-
转换后的类型 := 要转换的类型(变量)
-
package main import "fmt" // 类型转换 // 转换后的类型 := 要转换的类型(变量) // 备注:整形不能转换为bool类型 func main() { a := 5 // int b := 3.0 // float64 // int 转换为 float64 类型转换 c := float64(a) fmt.Printf("%T\n", a) fmt.Printf("%T\n", b) fmt.Printf("%T\n", c) }
运算符
算数运算符
符号 | 描述 |
---|---|
+ | |
- | |
* | |
/ | |
% | |
++ | |
– |
关系运算符
符号 | 描述 |
---|---|
== | |
!= | |
> | |
< | |
>= | |
<= |
逻辑运算符
符号 | 描述 |
---|---|
&& | 逻辑and运算符 |
|| | 逻辑or运算符 |
! | 逻辑not运算符 |
位运算符(二进制)
Go语言支持的位运算符如下表所示。假定A为60,B为13:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。都是1结果为1,否则是0 | (A & B)结果为12,二进制为0000 1100 |
| | 按位或运算符"|"是双目运算符。都是0结果为0,否则是1 | (A | B)结果为61,二进制为0011 1101 |
^ | 按位异或运算符"^"是双目运算符。相同为0,不同为1 | (A ^ B)结果为49,二进制为0011 0001 |
&^ | 位清空,a &^ b, 对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0 | (A &^ B)结果为48,二进制为0011 0000 |
<< | 左位移运算符"<<“是双目运算符。左位移n位,就是乘以2的n次方。其功能是把”<<“左边的运算数的各二进制全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,地位补0。 | A << 2 结果为240,二进制为1111 0000 |
>> | 右位移运算符">>“是双目运算符。右位移n位,就是除以2的n次方。其功能是把”>>“左边的运算数的各二进制全部右移若干位,由”>>"右边的数指定移动的位数。 | A >> 2结果为15,二进制为0000 1111 |