文章目录
一.到官网下载
- 官网https://golang.google.cn/doc/install?download=go1.16.windows-amd64.msi
- 配置 go 语言的运行环境,内容较多,不再累赘。
- 如果使用 vs core 编译,需要安装相应的插件。
二.运行
输入如下代码
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
运行 go build
,那么就会生成相应的 exe 文件,运行该文件,生成成功。
2.2 如果你想重命名生成的文件
go guild -o yourname.exe
2.3 执行想两步成一步 (即先执行buid,然后再把生成的 exe文件,放到 bin 目录下)
go install
2.4 跨平台编译
不同的环境,命令不同,用到再说吧。
三. 基础用法
3.1目录结构
// 这个包是属于哪个包,是main的话,可以直接执行。
package main
// 导入包,要使用双引号
import "fmt"
// 函数外只能声明变量,不能写语句
func main() {
fmt.Println("Hello world")
}
3.2 变量声明
package main
// 声明变量
import "fmt"
// var name string
// var age int
// var isOk bool
// 批量的声明变量
// GO 中提倡使用驼峰式的命名规则
var(
name string
age int //
isOk bool // false
)
func main() {
name="理想"
age =16
isOk = true
// Go 语言中非全局声明必须使用,不使用就编译过去
fmt.Print(isOk)
fmt.Println(name)
fmt.Printf("age:%d",age) // 使用占位符打印
}
3.3 不同变量的声明
var s1="你好" // 当编译器能推断的时候,可以不需要指定类型。
s2:="哈哈" // 简短的变量声明,只能在函数内部使用
x,_:=foo() //匿名变量 有一个变量,但是你不想用,要使用——可以使用_
注意:只有在声明公共变量的时候,能声明但不使用,声明局部变量的时候,声明了不使用,是没有办法通过编译的。
3.4 常量和 iota
iota 表示常量计数器
// 常量定义以后,不能修改,在程序运行期间,不能改变。
const s3=3.1415926
// 批量声明常量
const (
STATUS_OK=200
NOTEFOUNT=404
)
const(
n1=100
n2
n3 // 不声明的话,默认都和上一行一样。
)
// iota
const(
a1=iota // a1=0
a2 // 1
a3 // 2
a4 // 3
)
iota 的用法
// iota
const(
c1=iota // c1=0
c2=100 // c2=100
c3=iota // c3=2 在同一const里,iota 出现,一行累加一次
c4 // c4=3
)
Iota的基本使用
// 定义数量级
const (
_=iota
KB=1<<(10*iota) // 左移10位
MB=1<<(10*iota) // 再左移10位
GB=1<<(10*iota) // 再左移10位
TB=1<<(10*iota) // 再左移10位
PB=1<<(10*iota) // 再左移10位
)
3.5 浮点型
func main() {
// 整型
var a int =5
fmt.Printf("%d\n",a)
// 浮点数
var b float64 =4.5
fmt.Printf("%f\n",b)
// 查看类型
f1:=1.23456
fmt.Printf("%T\n",f1)
}
3.6布尔值
func main() {
b1:=true
var b2 bool
fmt.Printf("%v\n",b1)
fmt.Printf("%T\n,%v\n",b2,b2)
}
输出结果
true
bool
false
3.7 字符串
反引号的作用:能把原内容的东西,不变的打印出来
func main() {
// 字符串下,反斜线是原样的输出
a:=`
竹杖芒鞋轻胜马
一蓑烟雨任平生
`
fmt.Println(a)
}
直接字符串是不能改变的,可以改成切片以后,更改字符串的某一部分
func main() {
s1 := "白萝卜"
s2 := []rune(s1) // 强制转换成切片
s2[0] = '红' // 应该改成字符型,不应该是双引号
fmt.Println(string(s2))
}
3.8 流程控制
判断语句
func main() {
// 单个语句的判断
age := 15
if age > 18 {
fmt.Println("澳门首家线上赌场开业了")
} else {
fmt.Println("该写暑假作业了")
}
// 多个条件判断
if age > 35 {
fmt.Println("人到中年")
} else if age > 18 {
fmt.Println("青年")
} else {
fmt.Println("好好学习!")
}
}
循环语句
func main() {
// 基本操作
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 变种1 (省略初试语句)
var a = 1
for ; a < 10; a++ {
fmt.Println(a)
}
// 键值循环
s := "Hellow 你好"
for i, v := range s {
fmt.Printf("%d,%c\n", i, v)
}
}
continue 和 break 语句
func main() {
// 变种1 (省略初试语句)
var a = 1
for ; a < 10; a++ {
if a==3 {
continue // 调出
}
if a == 5 {
fmt.Println("over")
break // 调出for 循环
}
fmt.Println(a)
}
}
switch
swithch 相当于是 else if 的一个变种
func main() {
// 变种1 (省略初试语句)
n := 3
if n == 1 {
fmt.Println("大拇指")
} else if n == 2 {
fmt.Println("食指")
} else if n == 3 {
fmt.Println("中指")
} else if n == 4 {
fmt.Println("无名指")
} else if n == 5 {
fmt.Println("小拇指")
} else {
fmt.Println("无效的数字")
}
// 如果 switch 简化上面的代码
switch n {
case 1:
fmt.Println("大拇指")
case 2:
fmt.Println("食指")
default:
fmt.Println("无效的数字")
}
}
3.9 调出两层循环
可以使用外边设置一个 flag ,也可以使用 goto + lable
,但建议使用 外边设变量的方法。
func main() {
// 变种1 (省略初试语句)
var flag = false
for i := 0; i < 10; i++ {
for j := 0; j < 20; j++ {
if j == 10 {
flag = true // 调出内循环
break
}
fmt.Println(j)
}
if flag {
break // 调出外循环
}
}
}
3.10 运算符
数组的长度是数组类型的一部分,也就是说 [2]int 和 [5]int 不是一个类型
var a1 [3]int
var a2 [4]int
a1=a2 // 这样是错误的
3.11 数组的初始化和遍历
func main() {
// 如果不初始化,数组就是0
var a1 [3]int
// 初始化方法1
a1 = [3]int{
1, 2, 3}
fmt.Println(a1)
// 初始化方法2
a2 := [...]int{
0, 1, 2, 3, 4} // 使用 ... 可以自动推算出来后边的数
fmt.Println(a2)
// 初始化方法3
a3 := [5]int{
0, 1}
fmt.Println(a3)
// 初始化方法4 (根据索引来初始化)
a4 := [5]int{
0: 4, 4: 2}
fmt.Println(a4)
// 数组的遍历 (使用 foreach)
citys := [...]string{
"北京", "上海", "深圳"}
for i := 0; i < len(citys); i++ {
fmt.Println(citys[i])
}
// 数组的遍历 (for range 遍历)
for i, v := range citys {
fmt.Println(i, v)
}
// 多维数组 [[1,2][3,4][5,6]]
var a5 [3][2]int
a5 = [3][2]int{
[2]int{
1, 2},
[2]int{
3, 4},
[2]int{
5, 6},
}
fmt.Println(a5)
// 数组是值类型的
b1 := [...]int{
1, 2, 3}
b2 := b1
b2[0] = 100
fmt.Println(b1)
fmt.Println(b2)
}