美文网首页
golang记录

golang记录

作者: 苏州运维开发 | 来源:发表于2018-09-21 17:36 被阅读0次

获取本地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
        }
    }

}

相关文章

  • Golang菜鸟教程-学习笔记-2019.1.27

    Golang菜鸟教程-学习笔记-2019.1.27 学习资料 菜鸟教程 进度记录 1.27 Sun golang开...

  • golang记录

    获取本地IP 限制golang最大并发数 golang最快响应伪代码如下 反射修改对象属性 关于defer中坑的最...

  • golang记录

    1.ddddd 文本1 文本2 文本3 dd 文本1 文本2 文本3 ddd 文本1 文本2 文本32192873

  • go问题整理

    初学golang,记录下日常遇到的问题 golang struct 字段是否被赋值 使用指针类型解决,代码示例 g...

  • 二叉树层序遍历BFS

    leetcode 刷题记录层序遍历模板,语言为 golang

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

  • golang学习记录

    变量定义 var 变量名 数据类型,可以使用 ":="简洁定义变量并初始化 函数外的每个语句都必须以关键字开始(...

  • Golang net/http: HTTP/1.x transp

    简述 今日用golang开发微信小程序 请求wechat服务接口碰到一个问题记录一下 用golang 标准库请求发...

  • Linux下Go的安装配置

    最近学一下Go语言,做个记录 环境 Ubuntu 20.04 VScode Golang 1.18.1 安装 首先...

  • 01Golang变量和基本数据类型

    首先,本文记录的是我自己学习golang的理解.并不适合他人学习观看. 1.数据类型 在golang中数据类型一般...

网友评论

      本文标题:golang记录

      本文链接:https://www.haomeiwen.com/subject/zvrznftx.html