首頁 後端開發 php教程 用nginx+uwsgi+redis實現遊戲GM聊天功能

用nginx+uwsgi+redis實現遊戲GM聊天功能

Aug 08, 2016 am 09:19 AM
msg return

原始需求

一個客服GM能夠加所有遊戲服內的玩家為好友,並能進行聊天。具體功能如下:
* GM上、下線
* 加遊戲玩家為好友
* 刪除遊戲玩家為好友
* GM發送聊天訊息
* 玩家推播聊天訊息
額外限定:一個GM帳號能夠加入多個遊戲玩家為好友,而一個遊戲玩家只能被一個GM帳號加入

需求分析

因為我們遊戲內並沒有跨服聊天、跨服好友這種功能,而且以後也不會支持,所以讓GM在遊戲裡面創建角色,然後加各個遊戲服的玩家聊天的方案是無法實施的。 而且GM其實不是一個遊戲角色,也不用在遊戲內創作。
整個的困難是,如何讓各個遊戲服存取GM發過來的各種數據,如何將玩家的數據推送給GM。

具體實現

為了實現GM的資料在各個伺服器傳遞,我們採用了一種簡單的方案:將GM的資料放在我們的web伺服器上,各個遊戲服定時從web伺服器去拿資料。
這個方案很簡單,web伺服器與遊戲服不用長連接,直接用http的get和post方法就可以拿數據了。整個架構如下:

<code><span>GM1</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>运维聊天服</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏web服务器</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏服务器1</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>-</span><span>游戏客户端1</span><span>|</span><span>|</span><span>|</span><span>|</span><span>|</span><span>|</span><span>GM2</span><span>游戏服务器2</span><span>游戏客户端2</span></code>
登入後複製

這裡客服GM1和GM2都用的web介面與遊戲客戶端聊天。
維運聊天服存在是因為:
* GM的創建需要運維那邊的審核。 。
* 遊戲的web伺服器可以進行白名單審查,只有維運聊天服的ip可以存取遊戲的web伺服器
上圖中只有遊戲客戶端與遊戲伺服器是採用的tcp長連接,其他都是使用http短連接來實現。
web伺服器採用的是nginx,而不是nodejs。 nginx方案挺成熟的,而且部署也很容易。
由於,我對python的熟悉程度比lua程度高很多,所以用了uwsgi來做代理,而不是直接用lua來寫。
而資料庫則採用的redis,redis設定了定時記憶體了。資料格式設定可參考我之前提的文章,基本上都是
gm:%d:name這種格式,key表示gmx的名字是什麼,val表示名字。

實作程式碼

nginx和uwsgi的設定已略去。因為隱私原因,相關IP已略去,程式碼裡面也有足夠的註釋,不再贅述:

<code><span>#encoding: utf-8</span><span>"""
新功能:
* GM注册
* GM上线
* GM下线
* 加游戏玩家为好友
* 删除游戏好友
* GM推聊天信息
* 玩家推聊天信息

---
消息数据格式为utf-8处理后的base64编码:游戏服和GM发过来的都是base64格式,要注意分隔符没做base64处理
GS只能用get方式推送消息,所以参数用类似于urllib quote(urlencode)进行了封装。运维客户端也用get

一个GM账号能添加多个游戏玩家为好友,而一个游戏玩家只能被一个GM账号添加

"""</span><span>from</span> config <span>import</span> *
<span>from</span> json <span>import</span> dumps, loads
<span>import</span> base64
<span>import</span> urllib
<span>import</span> urllib2
<span>import</span> copy
<span>import</span> redis


MSG_SEPARATOR = <span>","</span><span>#分割信息</span>
MAX_RECV_AMOUNT = <span>10</span><span>#每次消息10条吧</span>
MSG_MAX_LEN = <span>500</span><span>#消息不弄太长了</span>CONTENT_TYPE = [(<span>"Content-Type"</span>,<span>"text/html"</span>)]
HTTP_STATUS = {
    <span>200</span>: <span>"200 OK"</span>,
    <span>404</span>: <span>"404 Not Found"</span>,
}

GAME_SERVER_INFO_URL = <span>"http://xxxxxyyyyy"</span>ROLE_INFO_URL = <span>"http://xxyyy?uid=%s&hostnum=%s"</span>red = redis.StrictRedis(host=REDIS.HOST, port=REDIS.PORT, db=REDIS.DB)

<span>#游戏服务器IP白名单</span><span>if</span><span>not</span> globals().has_key(<span>"gServerIP"</span>):
    gServerIP = {}
    res_data = urllib2.urlopen(GAME_SERVER_INFO_URL)
    res = res_data.read()
    res_list = res.split(<span>"\n"</span>)
    <span>for</span> val <span>in</span> res_list: 
        <span>if</span><span>not</span> val:
            <span>continue</span>
        _, port, ip, _  = val.split(<span>" "</span>) 
        gServerIP[ip] = port

gGMIP = {
        <span>"xxxxyyyy"</span> : <span>1</span>,
}

<span><span>def</span><span>is_gm_account_exist</span><span>(account_id)</span>:</span><span>if</span> red.get(<span>"gm_account:%s:name"</span> % account_id):
        <span>return</span><span>1</span><span>return</span><span>0</span><span><span>def</span><span>is_inter_server</span><span>(hostnum)</span>:</span><span>if</span> ( int(hostnum) >= <span>1000</span> ):
        <span>return</span><span>0</span><span>return</span><span>1</span><span><span>def</span><span>check_is_int</span><span>(account_id)</span>:</span><span>try</span>:
        int(account_id)
    <span>except</span>:
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: -<span>1</span>})
    <span>return</span> ()

<span>#gm client ensures the id is unique</span><span><span>def</span><span>gm_create_account</span><span>(env, params)</span>:</span>
    account_id, account_name  = params[<span>"gm_account"</span>], urllib.unquote(params[<span>"gm_name"</span>]) 
    check_res = check_is_int(account_id)
    <span>if</span> check_res: <span>return</span> check_res
    <span>if</span> is_gm_account_exist(account_id):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>1</span>}) <span>#1 the role exists</span>
    red.set(<span>"gm_account:%s:name"</span> % account_id, account_name)
    red.sadd(<span>"gm_online_list"</span>, account_id)
    <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>})

<span>#check param</span><span><span>def</span><span>gm_add_friend</span><span>(env, params)</span>:</span>
    var = gm_account, hostnum, usernum = params[<span>"gm_account"</span>], params[<span>"host"</span>], params[<span>"uid"</span>]
    <span>for</span> num <span>in</span> var:
        check_res = check_is_int(num)
        <span>if</span> check_res: <span>return</span> check_res
    <span>if</span><span>not</span> is_gm_account_exist(gm_account):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span><span>if</span> ( red.get(<span>"gs_usernum:%s:friend"</span> % usernum) ):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>3</span>}) <span>#3 the usernum has gotten a friend</span><span>#内服计费没存数据,就不处理了</span><span>if</span><span>not</span> is_inter_server(hostnum):
        http_res_data = urllib2.urlopen(ROLE_INFO_URL % (usernum, hostnum))
        res = loads(http_res_data.read())
        <span>if</span> (type(res) != type({})) <span>or</span> (res.get(<span>"code"</span>, <span>0</span>) != <span>1</span>):
            <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>}) <span>#4 the uid doesn't exist</span>    red.sadd(<span>"gm_account:%s:friend"</span> % gm_account, usernum) <span>#两边都处理下</span>    red.sadd(<span>"gs_hostnum:%s"</span> % hostnum, usernum) <span>#记录该服务器的所有玩家</span>
    red.set(<span>"gs_usernum:%s:hostnum"</span> % usernum, hostnum) <span>#该玩家的信息</span>
    red.set(<span>"gs_usernum:%s:friend"</span> % usernum, gm_account) <span>#一个玩家只能被一个gm添加为好友</span>    red.sadd(<span>"apply_frd_list"</span>, usernum) <span>#usernum will be added </span>
    red.hdel(<span>"remove_frd_list"</span>, usernum) <span>#信息残留</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) 

<span><span>def</span><span>gm_remove_friend</span><span>(env, params)</span>:</span>
    account_id, uid = params[<span>"gm_account"</span>], params[<span>"uid"</span>]
    <span>if</span><span>not</span> is_gm_account_exist(account_id):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span><span>if</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid) != account_id:
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>})  <span># the usernum has friend but isn't the gm</span><span>if</span><span>not</span> red.srem(<span>"gm_account:%s:friend"</span> % account_id, uid):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>})  <span># the usernum is not a friend of the gm</span>    hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid)
    red.delete(<span>"gs_usernum:%s:hostnum"</span> % uid) <span>#合服考虑,如果合服了GM手动删除这个玩家吧</span>
    red.srem(<span>"gs_hostnum:%s"</span> % hostnum, uid)

    red.delete(<span>"gs_usernum:%s:friend"</span> % uid) 
    red.hset(<span>"remove_frd_list"</span>, uid, hostnum) <span>#uid的信息已经丢失,先额外保存下hostnum信息</span>
    red.srem(<span>"apply_frd_list"</span>, uid) <span>#信息残留</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>}) 

<span>#GM账号很少</span><span><span>def</span><span>gm_online</span><span>(env, params)</span>:</span>
    account_id = params[<span>"gm_account"</span>] <span>#可能客户端bug没发下线,直接sadd吧</span><span>if</span><span>not</span> is_gm_account_exist(account_id):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>2</span>}) <span>#2 the role doesn't exist</span>
    red.sadd(<span>"gm_online_list"</span>, account_id)
    <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>})

<span><span>def</span><span>gm_offline</span><span>(env, params)</span>:</span>
    account_id = params[<span>"gm_account"</span>]
    <span>if</span><span>not</span> red.srem(<span>"gm_online_list"</span>, account_id):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>})
    <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>})

<span>#存在usernum上,gs_msg和gm_msg</span><span><span>def</span><span>gm_sendmsg</span><span>(env, params)</span>:</span>
    account_id, uid, msg = params[<span>"gm_account"</span>], params[<span>"uid"</span>], urllib.unquote(params[<span>"msg"</span>]) <span>#只能向好友发</span><span>if</span><span>not</span> red.sismember(<span>"gm_account:%s:friend"</span> % account_id, uid):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>4</span>})  <span># the usernum is not a friend of the gm</span><span>if</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid) != account_id:
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>})  <span># the usernum has friend but isn't the gm or doesn't have</span>
    red.lpush(<span>"gs_usernum:%s:msg_from_gm"</span> % uid, msg)
    red.sadd(<span>"gm_newmsg_list"</span>, uid) <span>#gs get msg from this set</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>})

<span>#gm轮训所有的,他那边还有个服务器...</span><span>#{gm_account:{"uid": msg, "uid2": msg2}}</span><span><span>def</span><span>gm_receivemsg</span><span>(env, params)</span>:</span>
    user_set = copy.copy(red.smembers(<span>"gs_newmsg_list"</span>))
    msg_data = {}
    <span>for</span> uid <span>in</span> user_set:
        gm_account = red.get(<span>"gs_usernum:%s:friend"</span> % uid)
        <span>if</span><span>not</span> gm_account: <span>#理论上是不会</span><span>continue</span>
        msg_list = pop_msg(uid, <span>"msg_from_gs"</span>)
        send_msg = MSG_SEPARATOR.join(msg_list)
        <span>if</span><span>not</span> send_msg:
            <span>continue</span><span>if</span><span>not</span> gm_account <span>in</span> msg_data:
            msg_data[gm_account] = []
        msg_data[gm_account].append({<span>"uid"</span> : uid, <span>"msg"</span> : send_msg})
        <span>#red.srem("gs_newmsg_list", uid)</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(msg_data))})

<span><span>def</span><span>pop_msg</span><span>(uid, msg_type)</span>:</span>
    msg_list = []
    msg_key = <span>"gs_usernum:%s:%s"</span> % (uid, msg_type)
    msg_len = min(MAX_RECV_AMOUNT, red.llen(msg_key))
    <span>for</span> i <span>in</span> xrange(msg_len):
        piece_msg = red.rpop(msg_key)
        msg_list.append(piece_msg)
    <span>return</span> msg_list

<span>#---------------------GS----------------------</span><span>#apply and remove</span><span><span>def</span><span>get_frd_relation</span><span>(env, params)</span>:</span>
    host = params[<span>"host"</span>]

    apply_user_set = copy.copy(red.smembers(<span>"apply_frd_list"</span>))
    apply_data = {}  <span>#{"res":1 "data":base64({uid: gm_account})}</span><span>for</span> uid <span>in</span> apply_user_set:
        hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid)
        <span>if</span> hostnum != host:
            <span>continue</span>
        account_id = red.get(<span>"gs_usernum:%s:friend"</span> % uid)
        <span>if</span><span>not</span> account_id: <span>#error </span><span>continue</span>        apply_data[uid] = [account_id, red.get(<span>"gm_account:%s:name"</span> % account_id)]
        red.srem(<span>"apply_frd_list"</span>, uid)


    del_user_list = red.hkeys(<span>"remove_frd_list"</span>)
    remove_list = []
    <span>for</span> uid <span>in</span> del_user_list:
        hostnum = red.hget(<span>"remove_frd_list"</span>, uid)
        <span>if</span> hostnum != host:
            <span>continue</span>
        remove_list.append(uid)
        red.hdel(<span>"remove_frd_list"</span>, uid)
    <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"apply_data"</span>: base64.b64encode(dumps(apply_data)), <span>"remove_data"</span>: base64.b64encode(dumps(remove_list))})   

<span><span>def</span><span>gs_sendmsg</span><span>(env, params)</span>:</span>
    uid, msg = params[<span>"uid"</span>], urllib.unquote(params[<span>"msg"</span>])
    <span>if</span><span>not</span> red.get(<span>"gs_usernum:%s:friend"</span> % uid):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>0</span>, <span>"errno"</span>: <span>5</span>})  <span># the usernum has friend but isn't the gm or doesn't have</span>
    red.lpush(<span>"gs_usernum:%s:msg_from_gs"</span> % uid, msg)
    red.sadd(<span>"gs_newmsg_list"</span>, uid) <span>#gm get msg from this set</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>})

<span><span>def</span><span>gs_receivemsg</span><span>(env, params)</span>:</span>
    host = params[<span>"host"</span>]
    user_set = copy.copy(red.smembers(<span>"gm_newmsg_list"</span>))
    total_msg_list = [] 
    <span>for</span> uid <span>in</span> user_set:
        hostnum = red.get(<span>"gs_usernum:%s:hostnum"</span> % uid)
        <span>if</span> hostnum != host:
            <span>continue</span>
        msg_list = pop_msg(uid, <span>"msg_from_gm"</span>)
        user_msg = MSG_SEPARATOR.join(msg_list)
        <span>if</span><span>not</span> user_msg:
            <span>continue</span>
        msg_data = {
                <span>"uid"</span>   : uid,
                <span>"msg"</span>   : user_msg,
        }
        total_msg_list.append(msg_data)
    <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(total_msg_list))})

<span><span>def</span><span>get_online_list</span><span>(env, params)</span>:</span>
    host = params[<span>"host"</span>]
    send_list = []
    online_list = red.smembers(<span>"gm_online_list"</span>)
    <span>for</span> account_id <span>in</span> online_list:
        frd_set = red.smembers(<span>"gm_account:%s:friend"</span> % account_id)
        <span>for</span> uid <span>in</span> frd_set:
            <span>if</span> red.get(<span>"gs_usernum:%s:hostnum"</span> % uid) == host:
                send_list.append(account_id) <span>#只有这个服务器有gm的好友,才通知</span><span>break</span><span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, dumps({<span>"res"</span>: <span>1</span>, <span>"data"</span>: base64.b64encode(dumps(send_list))})

<span>#get:  action=create&gm_account&gm_name  创建账号</span><span>#get:  action=add&gm_account&host&uid 添加好友</span><span>#get:  action=del&gm_account&uid 删除好友</span><span>#get:  action=online&gm_account上线</span><span>#get:  action=offline&gm_account 下线</span><span>#get:  action=send&gm_account&uid&msg 发送消息</span><span>#get:  action=receive 轮训消息</span>
GM_FUNC = {
        <span>"create"</span>    : gm_create_account,
        <span>"add"</span>       : gm_add_friend,
        <span>"del"</span>       : gm_remove_friend,
        <span>"online"</span>    : gm_online,
        <span>"offline"</span>   : gm_offline,
        <span>"send"</span>      : gm_sendmsg,
        <span>"receive"</span>   : gm_receivemsg,
}

<span><span>def</span><span>handle_gm_ticket</span><span>(env, params)</span>:</span><span>if</span><span>not</span> gGMIP.get(env[<span>"REMOTE_ADDR"</span>], <span>0</span>):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, <span>"%s has no access to the website"</span> % env[<span>"REMOTE_ADDR"</span>]
    func = GM_FUNC.get(params[<span>"action"</span>], <span>None</span>)
    <span>if</span><span>not</span> func:
        <span>return</span> HTTP_STATUS[<span>404</span>], CONTENT_TYPE, <span>"err action %s"</span> % params[<span>"action"</span>]
    <span>return</span> func(env, params)

<span>#get    action=relation&host</span><span>#get    action=send&uid&msg</span><span>#get    action=receive&host</span><span>#get    action=online&host        </span>
GS_FUNC = { 
        <span>"relation"</span>  : get_frd_relation,
        <span>"send"</span>      : gs_sendmsg,
        <span>"receive"</span>   : gs_receivemsg,
        <span>"online"</span>    : get_online_list,
}

<span><span>def</span><span>handle_gs_ticket</span><span>(env, params)</span>:</span><span>if</span><span>not</span> gServerIP.get(env[<span>"REMOTE_ADDR"</span>], <span>0</span>):
        <span>return</span> HTTP_STATUS[<span>200</span>], CONTENT_TYPE, <span>"%s has no access to the website"</span> % env[<span>"REMOTE_ADDR"</span>]
    func = GS_FUNC.get(params[<span>"action"</span>], <span>None</span>)
    <span>if</span><span>not</span> func:
        <span>return</span> HTTP_STATUS[<span>404</span>], CONTENT_TYPE, <span>"err action %s"</span> % params[<span>"action"</span>]
    <span>return</span> func(env, params)

</code>
登入後複製

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

以上就介紹了用nginx+uwsgi+redis實現遊戲GM聊天功能,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

Java中return和finally語句的執行順序是怎樣的? Java中return和finally語句的執行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結論:return在finally之前執行,我們來看下字節碼層面上發生了什麼事情。下面截取case1方法的部分字節碼,並且對照源碼,將每個指令的含義註釋在

Vue3怎麼使用setup語法糖拒絕寫return Vue3怎麼使用setup語法糖拒絕寫return May 12, 2023 pm 06:34 PM

Vue3.2setup語法糖是在單文件組件(SFC)中使用組合式API的編譯時語法糖解決Vue3.0中setup需要繁瑣將聲明的變量、函數以及import引入的內容通過return向外暴露,才能在使用的問題1.在使用中無需return宣告的變數、函數以及import引入的內容,即可在使用語法糖//import引入的內容import{getToday}from'./utils'//變數constmsg='Hello !'//函數func

使用JavaScript中return關鍵字 使用JavaScript中return關鍵字 Feb 18, 2024 pm 12:45 PM

JavaScript中return的用法,需要具體程式碼範例在JavaScript中,return語句用來指定從函數傳回的值。它不僅可以用於結束函數的執行,還可以將一個值傳回給呼叫函數的地方。 return語句有以下幾個常見的用法:傳回一個值return語句可以用來傳回一個值給呼叫函數的地方。下面是一個簡單的範例:functionadd(a,b){

詳解JavaScript函數傳回值和return語句 詳解JavaScript函數傳回值和return語句 Aug 04, 2022 am 09:46 AM

JavaScript 函數提供兩個介面實現與外界的交互,其中參數作為入口,接收外界資訊;返回值作為出口,並將運算結果回饋給外界。以下這篇文章帶大家了解JavaScript函數回傳值,淺析下return語句的用法,希望對大家有幫助!

JavaScript如何使用return語句 JavaScript如何使用return語句 Feb 26, 2024 am 09:21 AM

JavaScript中return的使用方法,需要具體程式碼範例在JavaScript中,return是一個非常重要的關鍵字,它通常用於函數中傳回值或結束函數的執行。 return語句用來將值傳回給函數的呼叫者,並終止函數的執行。 return語句可以在函數的任何位置使用,並且可以傳回任何JavaScript資料類型,包括數字、字串、布林值、

Python回傳值return怎麼用 Python回傳值return怎麼用 Oct 07, 2023 am 11:10 AM

Python回傳值return用法是當函數執行到return語句時,就會立即停止執行,並將指定的值傳回給呼叫函數的地方。詳細用法:1、傳回單一值;2、傳回多個值;3、傳回空值;4、提前結束函數的執行。

MSG是什麼幣種,MSG幣值得投資嗎? MSG是什麼幣種,MSG幣值得投資嗎? Feb 21, 2024 pm 05:28 PM

MSG是什麼幣種MSG是一種加密貨幣,全稱為MessageCoin。它是基於區塊鏈技術的數位貨幣,具有去中心化、匿名性和安全性等特質。 MSG的使命在於促進全球範圍內的安全、高效的點對點通訊和價值轉移。 MSG幣值得投資嗎投資MSG幣需要綜合考慮多個因素,包括市場前景、技術實力和團隊背景等。 MSG幣的市場潛力備受關注。隨著加密貨幣產業的迅速發展,全球對去中心化通訊和支付的需求不斷攀升。作為一種專注於通訊和價值轉移領域的數位貨幣,MSG擁有廣泛的應用前景。 MSG幣的技術實力也是其吸引用戶的重要因素之一

See all articles