Go 语言入门
1. go语言介绍
Go语言(又称Golang)是一种由Google开发的开源编程语言,设计初衷是为了提高软件开发的效率和简化程序的构建。以下是Go语言的一些主要特点:
- 简洁性:Go语言的语法简洁明了,易于学习和使用,降低了开发者的学习曲线。
- 高性能:Go是编译型语言,生成的二进制文件运行速度快,适合高性能的系统开发。
- 并发支持:Go语言内置了强大的并发编程模型,通过Goroutine和Channel,使得处理并发任务变得简单高效。
- 垃圾回收:Go拥有自动垃圾回收机制,简化了内存管理,减少了内存泄露的风险。
- 强类型和静态类型:Go是强类型和静态类型的语言,能够在编译时发现类型错误,增强了代码的安全性。
- 跨平台:Go语言支持多种操作系统,可以在不同平台上编译和运行相同的代码。
- 丰富的标准库:Go的标准库提供了丰富的功能,支持网络编程、文件操作、数据处理等多种常见任务。
Go语言在云计算、微服务、网络编程等领域得到了广泛应用,尤其适合构建高效、可扩展的系统。
2. go语言环境
建议开发环境-集成豆包或goland,简单易上手
3. go基础语法
3-1. 基础模板
打印helloworld
package main
import (
"fmt"
)
func main(){
fmt.Println("Hello World")
}
3-2 其中 import 为导入库 ,func main()为主函数
3-2. 变量 package main
import (
"fmt"
"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
*变量申明 *
go可以自动确定类型,所以不需要申明变量类型
(1) var + 变量名 = 值
(2) 变量名 := 值
注意:关键字为 const + 变量名 = 值
3-3 if-else
package main
import "fmt"
func main() {
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
if 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")
}
}
与c语言类似,但是if后面没有括号
3-4 for循环
package main
import "fmt"
func main() {
i := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
与C语言大致一样, 但是也没括号 没有while循环和do while
** 3-4 switch语句**
package main
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
与C语言大致一样,但是也没有括号
特殊一点
switch里上述a变量类型可以是字符串,并且不需要break运行完case后面的会直接跳出 不会运行剩下的case。
3-5数组
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
数组用 var a[5]+数组里面数据类型 可以不用初始化 int 默认为0,string默认为[ ]里面space数为数组里元素个数
或者用 b := [5]int{1,2,3} ---{}里面可以什么都不写但是要加上{},也不可以越界
特殊之处--切片
实质是数组+指针
package main
import "fmt"
func main() {
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
由于数组中元素个数为定值,所以很少用,大多数用切片
切片与数组类似但是元素个数是可变化的
切片创建
eg:
s := make([]string,3)
与数组的操作相似,但是多了几点
追加元素s = append(s, "a")
** 删除无内置函数所以需要自己写**
eg: a = append(a[:2], a[3:]...) // 先取索引为2之前的元素不包括二,再取索引为3及之后的元素
其中a = append(...)为更新切片不是重新定义
即删掉了索引为2的元素
3-7 map
类似于python中的字典
m := make(map[string]int)
m["first"] = 1 //添加元素
delete(m , "first") //删除元素
元素里面是无序的。
3-8range
num := []int{1,2,3,4}
for i , s := range num{
fmt.Println(i, s) //i为索引,s为元素从头开始遍历
}
3-9函数
func add(a int ,b int) int {
return a + b
}
函数值里面必须申明变量类型,并且是后置的
3-10指针
指针使用有限制一般只用于函数里改变变量的值
3-11结构体
与c语言类似