Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

goroute初识

package main

import (
    "fmt"
    // "os"
    "time"
)

func test(){
    var i int 
    for {
        fmt.Println(i)
        time.Sleep(time.Second)
        i++
    }
}

func main() {
    go test()
    for {
        fmt.Println("running in main")
        time.Sleep(time.Second)
    }
}

利用go 启动一个goroute

chAnnel存取

先进先出
线程安全,多个goroutIne同时访问,不需要加锁
chAnnel是有类型的,一个整数的chAnnel只能存放整数

package main

import (
    "fmt"
    // "fmt"

)
type stu struct{
    name String
}

func main() {
    //int类型
    var intChan chan int 
    intChan = @H_483_91@make(chan int,10)
    intChan <- 10

    a := <- intChan
    fmt.Println(a)
    fmt.Println("--------/map类型---------")
    //map类型
    var mapChan chan @H_878_29@map[String]String
    mapChan = @H_483_91@make(chan @H_878_29@map[String]String,10)
    m:= @H_483_91@make(@H_878_29@map[String]String,16)
    m["stu01"] = "001"
    m["stu02"] = "002"
    m["stu03"] = "003"
    mapChan <- m

    b := <- mapChan
    fmt.Println(b)
    fmt.Println("--------结构体---------")
    //结构体
    var stuChan chan stu
    stuChan = @H_483_91@make(chan stu,10)
    stu:= stu{
        name:"safly",}

    stuChan <- stu
    tempstu := <- stuChan
    fmt.Println(tempstu)


    fmt.Println("--------结构体内存地址---------")
    //结构体内存地址值
    var stuChanId chan *stu
    stuChanId = @H_483_91@make(chan *stu,10)
    stuId := &stu{
        name:"safly",}

    stuChanId <- stuId
    tempstuId := <- stuChanId
    fmt.Println(tempstuId)
    fmt.Println(*(tempstuId))

    fmt.Println("-----------接口---------")
    //接口
    var stuInterChain chan interface{}
    stuInterChain = @H_483_91@make(chan interface{},10)
    stuInit:= stu{
        name:"safly",}
    //存
    stuInterChain <- &stuInit
    //取
    mFetchstu:= <- stuInterChain
    fmt.Println(mFetchstu)

    //转
    var mstuConvert *stu
    mstuConvert,ok := mFetchstu.(*stu)
    if !ok{
        fmt.Println("cAnnot convert")
        return
    }
    fmt.Println(mstuConvert)
    fmt.Println(*(mstuConvert))

}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
10
--------/map类型---------
@H_476_35@map[stu03:003 stu01:001 stu02:002]
--------结构体---------
{safly}
--------结构体内存地址---------
&{safly}
{safly}
-----------接口---------
&{safly}
&{safly}
{safly}
PS E:\golang\go_pro\src\safly>

开启goroute,实现chAnnel存取

package main

import (
    "time"
    "fmt"
)

func main() {
    intChan := @H_483_91@make(chan int,5)
    go write(intChan)
    go read(intChan)

    time.Sleep(10 *time.Second)
}

/* 由于管道容量是5,开启go写入10个数据,再写入5个数据, 会阻塞, 然而read每秒会读取一个,然后在会写入一个数据 */
func write(ch chan int){
    for i:= 0;i<10;i++{
        ch <- i
        fmt.Println("put data:",i)
    }
}

func read(ch chan int){
    for{
        var b int
        b = <- ch
        fmt.Println(b)
        time.Sleep(time.Second)
    }
}

测试输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
put data: 0
put data: 1
put data: 2
put data: 3
put data: 4
put data: 5
0
1
put data: 6
2
put data: 7
3
put data: 8
4
put data: 9
5
6
7
8
9
PS E:\golang\go_pro\src\safly>

chAnnel关闭

chAnnel关闭后,就不能取出数据了

package main

import "fmt"

func main() {
    var ch chan int
    ch = @H_483_91@make(chan int, 5)

    for i := 0; i < 5; i++ {
        ch <- i
    }

    close(ch)
    for {
        var b int
        b,ok := <-ch
        if ok == false {
            fmt.Println("chan is close")
            break
        }
        fmt.Println(b)
    }
}

输出如下:

PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly> go run demo.go
0
1
2
3
4
chan is close
PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly>

如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁
因为存入管道5个数字,然后无限取数据,会出现死锁

range

package main

import "fmt"

func main() {
    var ch chan int
    ch = @H_483_91@make(chan int, 10)

    for i := 0; i < 10; i++ {
        ch <- i
    }

    close(ch)
    for v := range ch {
        fmt.Println(v)
    }
}

输出如下:

PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly> go run demo.go
0
1
2
3
4
5
6
7
8
9
PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly>

同样如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁 因为存入管道10个数字,然后无限取数据,在取出来第10个数据,在次range管道,会dead lock

大佬总结

以上是大佬教程为你收集整理的golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取全部内容,希望文章能够帮你解决golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。