「学习笔记」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框架
- 「学习笔记」Golang -- Go协程 与 通道
- 「学习笔记」Golang -- 读写数据
- 「学习笔记」Golang -- 动态类型与反射
- 「学习笔记」Golang -- 控制语句与错误处理
- 「学习笔记」Golang -- 内置数据类型
- 「学习笔记」Golang -- 基础入门