-module(module_name). -behaviour(gen_server). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -record(state, {}). init([]) -> {ok, #state{}}. handle_call(Request, From, State) -> %% Request最好为元组,可以多样化,带参数 Reply = ok, {reply, Reply, State}. handle_cast(Msg, State) -> {noreply, State}. handle_info(Info, State) -> {noreply, State}. terminate(Reason, State) -> ok. code_change(OldVsn, State, Extra) -> {ok, State}.
实现gen_server模式需要实现[init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]这六个接口.
init/1 : 当start_link调用后,自己回调这个函数.
handle_call/3 : 由gen_server:call(Name, Request) 驱动 第一个参数可以是?MODULE也可以是Pid,第二个参数为元组是handle_call 的第一个参数.
handle_cast/2 : 由gen_server:cast 驱动 和 handle_call 一样.
handle_info/2 : 这个系统内部消息驱动,或者消息过来,比如send !.具体怎么个法,需深造.
terminate/2 : 当进程被终止时驱动.
code_change/3 : 当代码热更新时被驱动.
handle_call/3和handle_cast/2有什么区别,两个一样的,貌似第一个有返回值,第二个没有我们需要的返回值.
是不是可以自己用这种方法来封装自己的模块,方便其他地方调用,有待考察,先记一下.
-module(module_name). %% -type ... %% -callback ..... 这里就是回调函数,也就是继承后需要实现的接口