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 -- 基础入门