文章目录
- 1. 基础数据类型
- 2.内置函数
- 3.函数
- 4.列表操作及for循环
- 5.原子性操作
- 6.通道
- 7.协程与并发安全
- 8.定时器
1. 基础数据类型
1. bool:布尔类型,只有 true 和 false 两个值。
var test2 bool = true
2. string:字符串类型,表示一组字符序列。
var test2 string = "GO从入门到入坑"
3. int、int8、int16、int32、int64:整数类型,分别表示有符号整数类型的不同大小(表示可以为负数)。
var test3 int = -666
4. uint、uint8、uint16、uint32、uint64:无符号整数类型,分别表示无符号整数类型的不同大小(表示不能为负数)。
var test4 uint = 777
5. uintptr:无符号整数类型,用于存储指针。
var x int = 10
var p uintptr = uintptr(unsafe.Pointer(&x))
fmt.Printf("x = %d, p = %d\n", x, p)
6. float32、float64:浮点数类型,分别表示单精度和双精度浮点数。
var test5 float32 = 3.14
7. complex64、complex128:复数类型,分别表示具有 float32 和 float64 组件的复数值。
var realpart float32 = 1.24
var imagpart float32 = 2.34
var c complex64 = complex(realpart, imagpart)
8. 字符型(rune 和 byte)
var test6 rune = 'A'
8.map字典
m := map[string]int{"foo": 1, "bar": 2, "baz": 3}
9.Pointer指针
x := 10
p := &x
fmt.Println(x, p)
fmt.Println(*p)
*p = 20
fmt.Println(x)
2.内置函数
1.len:返回传入参数的长度,如字符串、数组、切片、字典或通道等。
l := []int{1, 2, 3, 4, 5, 6}
fmt.Println(len(l))
2.cap:返回传入参数的容量,如切片或数组等。
l := []int{1, 2, 3, 4, 5, 6}
fmt.Println(cap(l))
2.make:用于创建动态类型的值,如切片、映射、通道等。
m := make([]int, 3, 5)
fmt.Println(m)
m := make(map[T1]T2, capacity)
m := make(map[string]int, 10)
ch := make(chan T, capacity)
ch := make(chan string, 10)
3.append:用于将元素追加到切片中。
qq := []int{1, 7, 1, 1, 0, 3}
qq = append(qq, 1, 0, 0, 6)
fmt.Println(qq)
4.copy:用于将一个切片的内容复制到另一个切片中。
qq := []int{1, 7, 1, 1, 0, 3}
ql := []int{1, 0, 0, 6}
ll := copy(qq, ql)
fmt.Println(ll)
fmt.Println(qq)
5.close:用于关闭通道。
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}()
for n := range ch {
fmt.Println(n)
}
6.panic、recover:用于处理程序中的异常情况。引发一个运行时恐慌,v 可以是任何值。
func main(){
fmt.Println("start")
doSomething()
fmt.Println("end")
}
func doSomething() {
fmt.Println("Doing something")
panic("Error!")
}
7.print、println、printf:用于将给定的参数打印到控制台。
a := "hello"
b := 123
fmt.Print(a, b)
a := "hello"
b := 123
fmt.Println(a, b)
a := "hello"
b := 123
fmt.Printf("%s %d", a, b)
8.new:返回一个类型为 T 的指针,指向一个新分配的零值,并返回其地址。
p := new(int)
fmt.Println(*p)
*p = 123
fmt.Println(*p)
9.delete(m, key):从映射 m 中删除键值为 key 的元素。
m := map[string]int{"a": 1, "b": 2, "c": 3}
delete(m, "b")
fmt.Println(m)
3.函数
1. 无参函数
func function1() {
fmt.Println("无参函数 直接调用")
}
func function2() int {
return 666
}
2. 有参函数
func function3(a, b int, c string) {
fmt.Println("有参函数 指定类型依次传入")
}
func function4(a, b int) (int, int) {
return a + b, b * a
}
3. 递归调用
func function5() {
fmt.Println("6666")
function5()
}
4. 定义函数属性类型
type Books struct {
title string
author string
}
5. 占位符
func GetData() (int, string) {
return 10, "hello"
}
4.列表操作及for循环
list := []int{123, 456, 789, 111}
list = append([]int{555}, list...)
list = append(list, 222)
fmt.Println(list)
for i, v := range list {
fmt.Println(i, v)
}
5.原子性操作
package main
import (
"fmt"
"sync/atomic"
"time"
)
func main() {
var cnt uint32 = 0
for i := 0; i < 10; i++ {
go func() {
for i := 10; i < 200; i++ {
time.Sleep(time.Millisecond)
atomic.AddUint32(&cnt, 1)
}
}()
}
time.Sleep(time.Second)
cntFinal := atomic.LoadUint32(&cnt)
fmt.Println("cnt:", cntFinal)
}
6.通道
package main
import "fmt"
func hello(done chan bool) {
fmt.Println("Hello Goroutine")
done <- true
}
func main() {
done := make(chan bool)
go hello(done)
<-done
fmt.Println("main function")
}
7.协程与并发安全
package main
import (
"fmt"
"math/rand"
"runtime"
"sync"
_ "sync"
"time"
)
var total int32 = 10
var mutex sync.Mutex
var wg sync.WaitGroup
func sell(i int) {
for total > 0 {
mutex.Lock()
if total > 0 {
time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond)
total--
fmt.Println("id:", i, " ticket:", total)
}
mutex.Unlock()
}
wg.Done()
}
func main() {
runtime.GOMAXPROCS(8)
rand.Seed(time.Now().Unix())
wg.Add(5)
for i := 0; i < 5; i++ {
go sell(i)
}
wg.Wait()
fmt.Println(total, "Done")
}
8.定时器
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second)
go func() {
for t := range ticker.C {
fmt.Println(t)
}
}()
timer := time.NewTimer(10 * time.Second)
<-timer.C
ticker.Stop()
fmt.Println("timer expired!")
}