变量定义
两种方式
所有 var str string
函数内 str := "hello"
数据类型介绍
布尔类型(bool) :布尔类型占用 1 个字节,取值范围为 true 和 false。
字符串类型(string) :字符串类型的占用空间大小与字符串的长度有关,在 Go 语言中,字符串是以 UTF-8 编码存储的,每个字符占用 1 到 4 个字节不等。
整数 类型 ( int ) :整数类型的占用空间大小与机器字长有关,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节。整数类型包括 int8、int16、int32、int64 等。
浮点数类型(float64) :浮点数类型占用 8 个字节,包括 float32 和 float64。
复数类型:复数类型占用 16 个字节,包括 complex64 和 complex128。
数组 类型 (Array) :是固定长度的相同类型元素的集合。可以通过索引访问数组中的元素。数组类型的占用空间大小与数组的长度和元素类型有关,例如,一个长度为 10 的 int32 数组占用 40 个字节。
切片(Slice) :是动态数组,可以方便地对数组进行截取、追加和扩展操作。
arr := make([]string, 0, 10)
0 cap 实际占用
10 len 容量 length不足时,会自动扩大2倍
1.18后 小于256时,双倍扩容。大于等于256时,扩容后容量=1.25倍的原容量+ 192
插入
arr = append(arr, "hello")
arr = append(arr, arr2...)
切割 arr[1:] arr[:]
按index取值:arr[index]
映射 (Map):是一种无序的键值对集合。使用字符串作为键,通过键来访问对应的值。 映射类型的占用空间大小与映射中的键值对数量有关,在 64 位机器上,每个键值对占用 16 个字节。
map1 := make(map[string]string, 100)
map1["hello"] = "world"
结构体类型:结构体类型的占用空间大小与结构体中的字段类型和数量有关,结构体中的每个字段都会占用一定的空间。
指针类型:指针类型的占用空间大小与指针指向的类型有关,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节。
str := []string("hello")
str1 := &str
取值: *str1 取地址: &str
通道 (Channel):是一种用于在不同协程之间进行通信和同步的数据结构。 通道类型的占用空间大小与机器字长有关,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节。
c := make(chan int, 10)
c <- 2
s := <-c
close(c)
关闭后无法插入
条件判断及循环语句
- 条件 语句(if-else) :用于根据条件执行不同的代码块。
if a<0 {
} else if a>=0 && a<=100 {
} else {
}
- 选择语句(switch) :用于根据表达式的值选择执行不同的代码块。
switch{
case a>0:
xxx
default:
}
c_int := 0
switch c.(type){
case string:
c_int, _ = strconv.atoi(c.(string))
default:
}
- 循环语句(for) :用于重复执行一段代码。
for i:=0;i<100;i++{
}
for index,value := range arr{
}
for{}
函数
- 函数定义:使用
func关键字定义函数,指定函数名、参数列表和返回值类型。
func hello(a string, b int) int{
return b+1
}
小写开头本包内可见,大写可被其他包调用
a := Hello("h", 10)
init()函数,默认调用
func(){}()
- 函数调用:使用函数名和参数列表来调用函数。
- 递归函数:函数可以调用自身,实现递归计算。
- 匿名函数:可以在代码中定义匿名函数,用于实现简单的功能。
结构体及接口
- 结构体(Struct) :用于将不同类型的数据组合在一起,形成一个数据结构。
type People struct {
Name string
Age int
}
p := People{
Name: "people",
}
p.Name = "people11"
fmt.Println(p)
利用map去重 map[string]struct{}{}
- 方法(Method) :可以为结构体定义方法,用于操作结构体中的数据。
func (p People) hello(s string) string{
return s
}
p:= People{Name:"xiaoming"}
p.hello("hello")
- 接口 ( Interface ) :是一组方法的集合,可以用于定义对象的行为。
type S interface{
hello(s string)string
}
func Hello(s S, a string)string{
return S.hello(a)
}
Hello(p, "hello")
Hello(p1, "world")
- 空 接口 ( Interface {}) :可以用于表示任何类型的对象。
包导入
import "fmt"
import _ "github.com/go-sql-driver/mysql"
单文件
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
go run main.go
多线程
go func1()
go func2()
s := sync.WaitGroup{}
s.Add(2)
go func() {
defer s.Done()
hello("a")
}()
go func() {
defer s.Done()
hello("b")
}()
s.Wait()