<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 使用libevent庫作為例子 下載 & 編譯 & 安裝libevent ``` $ git clone https://github.com.cnpmjs.org/libevent/libevent.git $ cd libevent && mkdir build && cd build $ cmake .. $ make ``` ## libevent實現的定時器 ``` // main.cpp #include "event.h" struct event ev; struct timeval tv; void time_cb(evutil_socket_t fd, short event, void *argc) { printf("timer wakeup\n"); event_add(&ev, &tv); // reschedule timer } void timerr() { struct event_base *base = event_base_new(); tv.tv_sec = 2; tv.tv_usec = 0; evtimer_set(&ev, time_cb, NULL); event_base_set(base, &ev); event_add(&ev, &tv); event_base_dispatch(base); event_base_free(base); } ``` ## go調用libevent實現定時器 把編譯好的頭文件和庫文件放到go工程里 ``` /go_libevent ├── libevent ├──├── include ├──├── lib ├── main.go ``` main.go ``` package main /* #cgo CFLAGS: -I ${SRCDIR}/libevent/include #cgo LDFLAGS: -L ${SRCDIR}/libevent/lib -levent -levent_core -levent_extra -lcrypto -lssl -lpthread #include "event.h" #include "event2/event.h" typedef void(*cb)(evutil_socket_t, short, void *); struct event evg; struct timeval tvg; struct event* getEventPtr() { return &evg; } struct timeval* getTvPtr() { tvg.tv_sec = 1; tvg.tv_usec = 0; return &tvg; } void timer_cb(evutil_socket_t fd, short event , void* argc) { struct timeval tv; tv.tv_sec = 2; tv.tv_usec = 0; printf("timer wakeup\n"); struct event* ev = (struct event*)argc; event_add(ev, &tv); // reschedule timer } void ev_set_timer(struct event* evt, cb c) { evtimer_set(evt, c, (void*)evt); } */ import "C" import ( "fmt" "unsafe" ) func main() { fmt.Printf("asdfafad\n") var pev *C.struct_event = C.getEventPtr() var ptv *C.struct_timeval = C.getTvPtr() var base *C.struct_event_base base = C.event_base_new() //*C.struct_event_base var pbase *C.struct_event_base = (*C.struct_event_base)(unsafe.Pointer(base)) C.ev_set_timer(pev, (C.cb)(unsafe.Pointer(C.timer_cb))) C.event_base_set(pbase, pev) C.event_add(pev, ptv) C.event_base_dispatch(pbase) C.event_base_free(pbase) } ``` ## 知識點總結 ### cogo調用libevent庫的struct 調用libevent庫的 struct event: ``` C.struct_event ``` ### 函數指針 ``` typedef void(*cb)(evutil_socket_t, short, void *); ``` ### 調用cgo宏功能 libevent 中 有個宏函數 evtimer_set ``` #define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) ``` cgo直接調用 `C.evtimer_set` 會報錯 ``` could not determine kind of name for C.evtimer_set ``` 解決辦法是封裝一下 ``` void ev_set_timer(struct event* ev, cb c) { evtimer_set(ev, c,ev1); } ``` 然后調用方式為: ``` C.ev_set_timer() ``` ## Go和C互相調用指針 參考鏈接:https://blog.csdn.net/weixin_34055787/article/details/88883037 參考鏈接:https://chai2010.cn/advanced-go-programming-book/ch2-cgo/ch2-07-memory.html >Go調用C Code時,Go傳遞給C Code的Go指針所指的Go Memory中不能包含任何指向Go Memory的Pointer。 C調用的Go函數不能返回指向Go分配的內存的指針。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看