Golang – 基础入门
文章目录
Go
(又称Golang
)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言。
一、Hello World
Golang源文件的扩展是.go
,这些文件名均由小写字母组成,如hello.go
。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
要执行Golang
代码可以使用go run
命令,打包生成二进制文件可以使用go build
命令。
$ go run hello.go
Hello, World!
二、包
- 每个
Go
程序都由包构成,可以使用自身的包或者从其它包中导入内容,在Go
的安装文件里包含了一些可以直接使用的包,即标准库。 package
定义包名,程序从main
包开始运行,如果包名为main
,即package main
表示一个可独立执行的程序,每个Go
应用程序都包含一个名为main
的包。
如果需要多个包,它们可以被分别导入:
import "fmt"
import "os"
或更短且更优雅的方法(被称为因式分解关键字,该方法适用于import
、const
、var
和type
的声明或定义):
import (
"fmt"
"os"
)
可以使用包的别名来解决包名之间的名称冲突:
package main
import fm "fmt" // 设置 fmt 包的别名为:fm
func main() {
fm.Println("hello, world")
}
三、基础语法
- 在
Go
程序中,一行代表一个语句结束。如果将多个语句写在同一行,它们则必须使用;
人为区分,但不推荐。 - 单行注释以
//
开头, 多行注释也叫块注释,均已以/*
开头,并以*/
结尾。 - 标识符由
字母``数字``下划线
组成,且第一个字符必须是字母
或下划线
而不能是数字
。 - 字符串连接可以通过
+
实现,如:"hello" + "world"
。 - 使用
fmt.Sprintf
或fmt.Printf
格式化字符串并赋值给新串。Sprintf
根据格式化参数生成格式化的字符串并返回该字符串:fmt.Println(fmt.Sprintf("Code=%d&endDate=%s",stockcode,enddate))
输出Code=123&endDate=2024-12-31
。Printf
根据格式化参数生成格式化的字符串并写入标准输出。fmt.Printf("Code=%d&endDate=%s",stockcode,enddate)
输出Code=123&endDate=2024-12-31
。
四、基本数据类型
类型 | 默认值 | 描述 |
---|---|---|
布尔型:bool |
false |
布尔型的值只可以是常量true 或者false |
整型:int8 /int16 /int32 /int64 |
0 |
8/16/32/64 位整型 |
整型:uint8 /uint16 /uint32 /uint64 |
0 |
8/16/32/64 位无符号整型 |
浮点型:float32 /float64 |
0.0 |
32/64 位浮点数(IEEE754 ) |
复数类型:complex64 /complex128 |
(0.0+0.0i) |
32/64 位复数(实数和虚数) |
字符类型:byte |
‘\000’ |
类似uint8 ,表示ASCII 编码 |
字符类型:rune |
‘\000’ |
类似int32 ,表示UTF-8 编码 |
整型:int /uint |
0 |
32位系统类似int32 ,64位系统类似int64 |
指针类型:uintptr |
nil |
无符号整型,长度被设定为足够存放一个指针 |
- 可以使用
a+bi
表示复数,如0.5+1.5i
;可以使用内置函数func complex(r, i float64) complex128
构造复数类型。 - 任何指针类型不可直接转换为
uintptr
,uintptr
可以与unsafe.Pointer
相互转换,unsafe.Pointer
可以实现对任意数据类型的强制转换(使用unsafe.Pointer
),但这是危险的操作。 - 字符类型使用
单引号
表示,默认为rune
类型,当为ASCII
编码范围时,可以转换为byte
类型。
五、运算符与优先级
优先级 | 运算符 |
---|---|
7 | ^ :按位补足, ! :非 |
6 | * :乘, / :除, % :取余, << :位左移, >> :位右移, & :按位与, &^ :位清除(置0) |
5 | + :加, - :减, |:按位或, ^ :按位异或 |
4 | == != < <= >= > |
3 | <- |
2 | && |
1 | || |
可以通过使用括号来临时提升某个表达式的整体运算优先级。
六、变量
声明变量的一般形式是使用var
关键字:var identifier type
;需要注意的是,Go在声明变量时将变量的类型放在变量的名称之后。
var a int // 声明变量
var a int = 1 // 声明变量并设置初值
var a, b int = 1, 2 // 一次声明多个同类型变量
var a, b, i, s1, s2 = true, false, 3, "hello", "world" // 让编译器自动推测类型
// 声明多个不同类型变量
var (
a, c int = 1, 2
b bool
str string
t *int // 指针类型
)
声明变量的简短形式,使用:=
赋值操作符。:=
只能在函数内使用,不可以用于全局变量的声明与赋值。使用操作符:=
可以高效地创建一个新的变量,称之为初始化声明。
a := 1 // var a int = 1
s := "Hello World!" // var s string = "Hello World!"
b, str := 2, "No Way Home."
匿名变量_
,伪接受数值,数值将直接被丢弃,不可访问其数值。
func getData() (int, int) {
return 10, 20
}
func main() {
a, _ := getData() // 10, _
_, a = getData() // _, 20
}
- 变量作用域
- 局部变量:
- 每一个
{}
可以被视为一个作用域,它包括函数
、if
语句、for
语句等。 - 在局部作用域定义的变量将在所定义的作用域结束时消亡。
- 每一个
- 全局作用域
- 直接定义在包中的函数、变量都是全局变量。
- 全局变量一旦被定义将始终存在,直到程序终止。
- 值类型和引用类型
- 在
Golang
中,数据类型可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。 - 值类型是指变量直接存储了实际的数据,并且每个变量都拥有独立的存储空间。当一个值类型的变量被赋给另一个变量时,会进行值拷贝,对其中一个变量的修改不会影响到原始变量。
- 值类型包括:
整型(int、uint、int8等)
、浮点型(float32、float64)
、复数(complex64, complex128)
、布尔型(bool)
、字符串型(string)
、数组(array)
、结构体(struct)
。
- 值类型包括:
- 引用类型并不直接存储数据本身,而是存储指向数据的指针,当复制一个引用类型的变量时,复制的是指针,新旧变量将指向相同的底层数据。
- 引用类型包括:
切片(Slices)
、映射(Maps)
、通道(Channels)
、接口(Interfaces)
、函数(Functions)
。
- 引用类型包括:
- 局部变量:
在函数参数传递时,值类型和引用类型的行为也不同。值类型参数在传递给函数时会创建一个副本,而引用类型参数传递的是指针的副本,所以函数内部对引用类型参数的修改会影响原始数据。
七、常量
const
声明常量:
const a int = 10 // 常量必须初始化
const a = 10 // 自动解析常量类型
const a, b int = 1, 2 // 定义同类型多常量
// 定义不同类型多常量
const (
a int = 10
s string = "Hello World!"
pi float64 = 3.1415926535
)
常量还可以用作枚举:
const (
Monday = 1
Tuesday = 2
Wednesday = 3
)
自增枚举可以使用iota
,iota
是特殊常量,在const
关键字出现时将被重置为0
,const
中每新增一行常量声明将使iota
计数一次(iota
可理解为const
语句块中的行索引,不同const
块互不干扰)。
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1,即3
e //"ha"(复用上一行,不推荐省略定义) iota += 1,即4
f = 100 //独立值,iota +=1,5
g //100(复用上一行,不推荐省略定义) iota +=1,即6
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
以上实例运行结果为:
0 1 2 ha ha 100 100 7 8
END .
相关系列文章
- Golang -- GoFrame学习笔记01
- Golang -- Go协程 与 通道
- Golang -- 读写数据
- Golang -- 动态类型与反射
- Golang -- 控制语句与错误处理
- Golang -- 内置数据类型
- Golang -- 基础入门