golang记录

获取本地IP

package main

import (
    "fmt"
    "net"
)

func LocalIp() string {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println(err)
    }
    var ip string = "localhost"
    for _, address := range addrs {
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                ip = ipnet.IP.String()
            }
        }
    }
    return ip
}

func main()  {
    fmt.Println(LocalIp())
}

限制golang最大并发数

package main

import (
    "fmt"
    "time"
)

func main()  {
    var limit = make(chan int , 3)   //限制最大并发数

    for i:=1 ; i <= 30 ; i++ {
        go func() {
            limit <- 1
            work()
            <-limit
        }()
    }
    select {}
}

func work()  {
    fmt.Println("work....")
    time.Sleep(1 * time.Second)
}

golang最快响应
伪代码如下

package main

import (
    "time"
    "fmt"
)

func remoteWork1()  string{
    time.Sleep(time.Second * 5)   //模拟响应时间
    return "work1"
}

func remoteWork2()  string{
    time.Sleep(time.Second * 2)   //模拟响应时间
    return "work2"
}

func remoteWork3()  string{
    time.Sleep(time.Second * 3)    //模拟响应时间
    return "work3"
}

func main()  {
    ch := make(chan string  )
    go func() {
        ch <- remoteWork1()
    }()
    go func() {
        ch <- remoteWork2()
    }()
    go func() {
        ch <- remoteWork3()
    }()
    fmt.Println(<-ch)      //以空间换时间,某些特定场景试用

}

反射修改对象属性

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

type TestObj struct {
    name string
    thisp this
    field1 string
}

type this struct {
    age []int
    address string
}


func main() {

    struct_ := &TestObj{name:"golang"}
    field, _ := reflect.TypeOf(struct_).Elem().FieldByName("thisp")
    field1Ptr := uintptr(unsafe.Pointer(struct_)) + field.Offset
    *((*this)(unsafe.Pointer(field1Ptr))) = this{[]int{1,2,3} ,"suzhou"}
    fmt.Println(struct_)
}

关于defer中坑的最佳解释
偶然在网上找到一份电子书《深入解析Go内核实现》(感谢作者)中有段关于解释defer执行原理的论述,真是言简意赅!
关键点:return xxx 不是一条原子指令!
defer坑如下:

package main

import "fmt"

func main()  {
    fmt.Println(f1())
    fmt.Println(f2())
    fmt.Println(f3())
    
}

func f1() (result int)  {
    defer func() {
        result++
    }()
    return 0
}

func f2() (r int)  {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}

func f3() (r int)  {

    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

输出结果一次为:1,5,1
上述代码与下面的代码执行过程一致

package main

import (
    "fmt"
)

func main()  {
    fmt.Println(ff1())
    fmt.Println(ff2())
    fmt.Println(ff3())

}

func ff1() (result int)  {
    result = 0
    func(){
        result++
    }()
    return
}

func ff2() (r int)  {
    t := 5 
    r = t
    func(){
        t = t + 5   
    }()
    return
}

func ff3() (r int)  {
    r = 1
    func (n int) {
        n = n + 5
    }(r)
    return
}

该电子书中还有更多价值,值得深入研究的地方,大家可以自行下载参阅!

自定义迭代器

package main

import "fmt"

type agg struct {
    contain []int
}

func (a *agg) getIter() IIterator {
    i := new(Iterator)
    i.aggs = a
    return i
}


type IIterator interface {
    hasNext() bool
    next() bool
    current() int
}


type Iterator struct {
    cursor int
    aggs *agg
}
func (i *Iterator) hasNext() bool {
    if i.cursor + 1 > len(i.aggs.contain) {
        return false
    }else {
        return true
    }
}

func  (i *Iterator) next() bool {
    if i.cursor < len(i.aggs.contain) {
        i.cursor++
        return true
    }
    return false
}


func  (i *Iterator) current() int {
    return i.aggs.contain[i.cursor]
}


func main()  {
    a := new(agg)
    a.contain = []int{1,2,3,4,5,66}
    i := a.getIter()
    for {
        if i.hasNext() {
            fmt.Println(i.current())
            i.next()
        } else {
            break
        }
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,093评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,512评论 2 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,073评论 19 139
  • 文/雍万萍 漫舞的黄叶 捎来了初冬的消息 回忆在瑟瑟的冷雨里 蜷缩成一团 流浪的游子 揣着一颗孤独的心 慢慢 慢慢...
    频彩阅读 1,351评论 4 10
  • 大龄剩女一子生活一团糟,整日沉迷游戏,萎靡不振,除了晚上去附近的百元店买吃的就很少出门,故事正是缘起她出门途经的拳...
    一块月亮阅读 3,110评论 0 0

友情链接更多精彩内容