golang出错集锦

golang花式出错

初始化问题

map
package main

import "fmt"

func main() {
	mapA := map[string]interface{}{}
	mapA["demoA"] = 11
	fmt.Println(mapA) //map[demoA:11]
	var mapB map[string]interface{}
	//未初始化mapB直接赋值
	mapB["demoB"] = 22
	fmt.Println(mapB) //panic: assignment to entry in nil map
}

奇怪的长度(初始化)

slice
package main

import "fmt"

func main() {
	args := make([]int, 3)
	//初始化值
	for i := 0; i < 3; i++ {
		args = append(args, i)
	}
	fmt.Println("len args :",len(args),"args",args) //len args : 6 args [0 0 0 0 1 2]
//	make已经初始化了三个元素,之后再append直接在尾部插入

//	正确做法
	argsR := make([]int, 3)
	for i := 0; i < 3; i++ {
		argsR[i] = i
	}
	fmt.Println("len args :",len(argsR),"args",argsR) //len args : 3 args [0 1 2]
}

常见创建goroutine错误

package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan int)

	go func() {
			select {
			case i := <-c1:
				fmt.Println("c1", i)
			}
	}()

	for {
	//想一直传值然后协程取值打印
		c1 <- 1
		time.Sleep(1 * time.Second)
	}
}
//输出
//c1 1
//fatal error: all goroutines are asleep - deadlock!

//创建的goroutine只有一次select所以c1只取一次值,当向c1第三次传值时死锁
//正确创建方法
go func () {
	for {
		select {
		case i := <-c1:
			fmt.Println("c1", i)
		}
	}

}()

定时任务

package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan int)

	go func() {
		for{
			select {
			case i := <-c1:
				fmt.Println("c1", i)
			case <-time.After(time.Second * 2):
				fmt.Println(time.Now())
			}
		}
	}()

	for {
		c1 <- 1
		time.Sleep(1 * time.Second)
	}
}
//永远不会进到case <-time.After(time.Second * 2)执行fmt.Println(time.Now())打印当前时间
//只要在2秒内其他case执行了就不会触发<-time.After(time.Second * 2)

正确方法,创建time.Ticker对象,取Ticker.C

package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan int)
	ticker := time.NewTicker(time.Second * 2)
	go func() {
		for {
			select {
			case i := <-c1:
				fmt.Println("c1", i)
			case <-ticker.C:
				fmt.Println(time.Now())
			}
		}
	}()

	for {
		c1 <- 1
		time.Sleep(1 * time.Second)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值