Golang中国

huangxianghan

Golang China 第 6261 号会员,加入于 2016-10-26 10:22


huangxianghan最近创建的主题


huangxianghan最近回复了


回复了 aaaaaaaa 创建的主题: 我想写个闹钟程序, 请问思路是怎样的? 2016-12-22 17:14

`

//一次性闹钟
func AlarmAt(t *time.Time, alertFunc func()) {
    d := time.Duration(t.Unix() - time.Now().Unix()*int64(time.Second))
    time.AfterFunc(d, alertFunc)
}

//每日闹钟
func DailyAlarmClock(h, m, s int, alarmFunc func()) {

    //首次计算到下一次闹钟所需的时间间隔
    now := time.Now()
    nextAlarmTime := time.Date(now.Year(), now.Month(), now.Day(), h, m, s, 0, time.Local)
    if now.After(nextAlarmTime) {
        nextAlarmTime = nextAlarmTime.Add(time.Hour * 24)
    }
    d := time.Duration((nextAlarmTime.Unix() - now.Unix()) * int64(time.Second))

    //时间到后,再用time.Tick每日触发一次
    time.AfterFunc(d, func() {
        go alarmFunc()
        go AlarmLoop(time.Hour*24, alarmFunc)
    })
}

//每周闹钟,weekday 0 是星期天1-6周一至周六。注意:国际惯例,星期天才是新的一周的开始,不是星期一。
func WeeklyAlarmClock(weekday, h, m, s int, alarmFunc func()) {

    //首次计算到下一次闹钟所需的时间间隔
    now := time.Now()
    nextAlarmTime := time.Date(now.Year(), now.Month(), now.Day(), h, m, s, 0, time.Local)
    d := time.Duration((int64(weekday) - int64(nextAlarmTime.Weekday())) * int64(24*time.Hour))
    nextAlarmTime = nextAlarmTime.Add(d)
    if now.After(nextAlarmTime) {
        nextAlarmTime = nextAlarmTime.Add(time.Hour * 24 * 7)
    }
    d = time.Duration((nextAlarmTime.Unix() - now.Unix()) * int64(time.Second))

    //时间到后,再用time.Tick每周触发一次
    time.AfterFunc(d, func() {
        go alarmFunc()
        go AlarmLoop(time.Hour*24*7, alarmFunc)
    })
}

func AlarmLoop(d time.Duration, alarmFunc func()) {
    tc := time.Tick(d)
    for _ = range tc {
        go alarmFunc()
    }
}

`

回复了 cqheshuang 创建的主题: 第一次写线程池,遇到一个不能完全正常输出的问题 2016-12-22 14:25

你确定你run方法里这两句:
len := task.List.Len()
value := task.Fetch()
是线程安全的?
container/list 包源码里并没有任何线程安全的保障哦。
this.List.Remove(val) 的时候多线程肯定出问题
list包源码是这样
func (l List) remove(e Element) *Element {
e.prev.next = e.next
e.next.prev = e.prev
e.next = nil // avoid memory leaks
e.prev = nil // avoid memory leaks
e.list = nil
l.len—
return e
}
next 和 prev 指针多线程竞态肯定出问题的。

回复了 shook 创建的主题: Golang的指针赋值有没有更方便的方法? 2016-10-26 10:50
额,那个写错了。这个可以
type IString struct {
    Value string
}

func (self *IString) String() string {
    return self.Value
}

type Test struct {
    ID   int64
    Name *IString
    PWD  *IString
    Time time.Time
}

func main() {

    t := new(Test)
    t.Name = &IString{"aaaaa"}
    fmt.Println(t)
}

输出 &{0 aaaaa <nil> 0001-01-01 00:00:00 +0000 UTC}
回复了 shook 创建的主题: Golang的指针赋值有没有更方便的方法? 2016-10-26 10:29

字段类型 设为interface{} 就可以放nil了,如果怕取值麻烦可以学西java的包装类。

type IString interface{}

func (self *IString) String() string{
    return self.(string)
}

func (self *IString) IsNil() bool {
    return self == nil
}

每个基本类型都自己定义一个包装类型。

huangxianghan 创建的更多回复