go
Go 是由谷歌工程师 Robert Griesemer、Rob Pike 和 Ken Thompson 设计的。它是一种静态类型的、编译的语言。
安装
- centos-yum
1
yum install golang
- centos-tar
1
2
3
4
5
6
7
8
9<!-- 下载 -->
https://go.dev/doc/install
<!-- 解压 -->
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.4.linux-amd64.tar.gz
<!-- 添加环境变量 -->
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
<!-- 重启终端查看go版本 -->
go version
hello, word
- Go 是由 packages(包)组成的。
vim main.go1
2
3
4
5
6
7
8
9package main # 程序入口点,package main 告诉 Go 编译器,该程序被编译为可执行文件,而不是共享库。
import (
"fmt"
)
func main(){
fmt.Println("Hello World!")
} - 执行
1
2
3go build main.go
./main
go run main.go
基础
- 变量
Go 中的变量是明确声明的。Go 是一种静态类型的语言。这意味着在声明变量的时候会检查变量的类型。1
2
3
4var a int // 声明a为int型,并附初始值0
var a = 1 // 等价于 var a int = 1
var a, b int = 1, 2
a := 1 // 只能在函数内部 - 整型、浮点型、无符号整型、字符串、布尔
1
2
3
4
5var e int = 1 // 整型:int, int8, int16, int32, int64
var d float32 = 3.14 // 浮点数:float32 和 float64
var c uint = 1 //无符号整型:uint, uint8, uint16, uint32, uint64, uintptr
var b string = 'hello' // 字符串:string
var a bool = true // 布尔:bool - 数组、切片、maps
1
2
3
4
5
6var a [5]int // 一维数组
var multiA [2][3]int // 二维数组
var b []int // 切片容量为 0、长度为 0 的切片。
numbers := make([]int, 5, 10) // 初始长度为 5,容量为 10。
numbers = append(numbers, 1, 2, 3, 4) // append 函数将值添加到数组的末端 - maps
1
2var m map[string]int
m['xx'] = 2 - 类型转换
1
2a := 1.1
b := int(a) - 条件语句
- if else
1
2
3
4
5
6
7if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
} - switch case
1
2
3
4
5
6
7
8
9i := 2
switch i {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("none")
}
- if else
- 循环
1
2
3
4
5
6i := 0
sum := 0
for i := 0; i < 10; i++ { // 三个条件都可以去掉
sum += i
}
fmt.Println(sum) - 指针
在传递结构体作为参数时,或者在为定义的类型声明方法时,通常倾向于使用指针。
传递值时,实际上是在复制值,这意味着更多的内存。
通过指针,函数改变的值会反映在 方法/函数 调用者身上。1
2
3
4a := 12
var ap *int
ap = &a
var ap *int = &a - 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14func add(a int, b int ) (c int, s string) {
c = a + b
s = "succ"
return // return c, s
}
func add(a int, b int ) (int, string) { // 同时有或者没有变量名
c := a + b
s := "succ"
return return c, s
}
funcmain() {
sum, msg := add(2, 1)
fmt.Println(sum, msg)
} - 结构体、方法、接口
Go并不是一种完全面向对象的语言,但通过结构体(Struct)、接口(Interface)和方法(Method),它有很多面向对象的支持和感觉。- 结构体:结构体是一种类型化的、不同字段的集合。结构体用于将数据分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14<!-- 定义 -->
type person struct { // 有序
name string
age int
gender string
}
<!-- 创建 -->
p := person{name: "Bob", age: 12, gender: "Male"}
p := person{"Bob", 12, "Male"}
<!-- 访问 -->
fmt.Println(p.name, p.age, p.gender)
<!-- 指针访问 -->
p := &person{name: "Bob", age: 12, gender: "Male"}
fmt.Println(p.name, p.age, p.gender) - 方法:方法(Method)是一种特殊的函数类型,它有一个 receiver 。receiver 可以是一个值或一个指针。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15func (p *person) describe() {
fmt.Printf("%v is %v years old.\n", p.name, p.age)
}
func (p *person) setAge(age int) {
p.age = age
}
func (p person) setName(name string) { // receiver是结构体值,并不是指针,所以是拷贝修改,不影响调用体
p.name = name
}
p := &person{name: "Bob", age: 12, gender: "Male"}
p.describe()
p.setAge(66)
fmt.Println(p.age)
p.setName("jesonlin")
fmt.Println(p.name)
- 结构体:结构体是一种类型化的、不同字段的集合。结构体用于将数据分组
REFERENCE
------------->本文结束感谢您的阅读-------------