[{"data":1,"prerenderedAt":3067},["ShallowReactive",2],{"content:\u002F2025\u002F12\u002Fproto-syntax":3,"surround:\u002F2025\u002F12\u002Fproto-syntax":3057},{"id":4,"title":5,"body":6,"categories":3034,"date":3036,"description":3037,"draft":3038,"extension":3039,"image":3040,"meta":3041,"navigation":155,"path":3043,"permalink":3040,"published":3040,"readingTime":3044,"recommend":3040,"references":3040,"seo":3049,"sitemap":3050,"stem":3051,"tags":3052,"type":3054,"updated":3055,"__hash__":3056},"content\u002Fposts\u002F2025\u002F12\u002Fproto-syntax.md","Protocol Buffers 核心语法详解",{"type":7,"value":8,"toc":3015},"minimark",[9,13,17,24,52,55,58,61,70,73,95,98,188,191,194,226,232,235,355,358,361,377,551,554,1237,1240,1243,1295,1302,1305,1330,1333,1339,1345,1348,1351,1356,1573,1576,1879,1887,1890,2157,2160,2164,2170,2176,2187,2190,2196,2203,2207,2210,2406,2409,2698,2701,2939,2942,2977,2980,2983,2986,2994,2997,3011],[10,11,12],"p",{},"虽然语法繁多但是每一个都很简单",[14,15,16],"h2",{"id":16},"syntax",[10,18,19,20],{},"语法，目前主要设置为",[21,22,23],"code",{"code":23},"proto3",[25,26,31],"pre",{"className":27,"code":28,"language":29,"meta":30,"style":30},"language-proto shiki shiki-themes github-light github-dark","syntax = \"proto3\";\n","proto","",[21,32,33],{"__ignoreMap":30},[34,35,38,41,44,48],"span",{"class":36,"data-line":37,"line":37},"line",1,[34,39,16],{"class":40},"szBVR",[34,42,43],{"class":40}," =",[34,45,47],{"class":46},"sZZnC"," \"proto3\"",[34,49,51],{"class":50},"sVt8B",";\n",[14,53,54],{"id":54},"package",[10,56,57],{},"用于指定生成的go文件所在文件夹的名称",[14,59,60],{"id":60},"go_package",[10,62,63,64,66,67,69],{},"因为go插件是通过",[21,65,29],{"code":29},"文件是生成对应的go代码，所以go_package相当于要生成的文件的",[21,68,54],{"code":54},"属性，用于指定包名",[10,71,72],{},"如：",[25,74,76],{"className":27,"code":75,"language":29,"meta":30,"style":30},"option go_package=\"proto-learn\u002Fpb\u002Fperson;person\";\n",[21,77,78],{"__ignoreMap":30},[34,79,80,83,87,90,93],{"class":36,"data-line":37,"line":37},[34,81,82],{"class":40},"option",[34,84,86],{"class":85},"sj4cs"," go_package",[34,88,89],{"class":40},"=",[34,91,92],{"class":46},"\"proto-learn\u002Fpb\u002Fperson;person\"",[34,94,51],{"class":50},[10,96,97],{},"分号隔开的是别名",[25,99,103],{"className":100,"code":101,"language":102,"meta":30,"style":30},"language-go shiki shiki-themes github-light github-dark","\u002F\u002F 写了别名\nimport (\n\tuser \"proto-learn\u002Fpb\u002Fuser\"\n)\n\n\u002F\u002F 没写别名\nimport (\n\t\"proto-learn\u002Fpb\u002Fuser\"\n)\n","go",[21,104,105,111,124,144,150,157,163,172,183],{"__ignoreMap":30},[34,106,107],{"class":36,"data-line":37,"line":37},[34,108,110],{"class":109},"sJ8bj","\u002F\u002F 写了别名\n",[34,112,114,117,120],{"class":36,"data-line":113,"line":113},2,[34,115,116],{"class":40},"import",[34,118,119],{"class":50}," ",[34,121,123],{"class":122},"sSDpw","(\n",[34,125,127,131,134,137,141],{"class":36,"data-line":126,"line":126},3,[34,128,130],{"class":129},"indent","\t",[34,132,133],{"class":50},"user ",[34,135,136],{"class":46},"\"",[34,138,140],{"class":139},"sScJk","proto-learn\u002Fpb\u002Fuser",[34,142,143],{"class":46},"\"\n",[34,145,147],{"class":36,"data-line":146,"line":146},4,[34,148,149],{"class":122},")\n",[34,151,153],{"class":36,"data-line":152,"line":152},5,[34,154,156],{"emptyLinePlaceholder":155},true,"\n",[34,158,160],{"class":36,"data-line":159,"line":159},6,[34,161,162],{"class":109},"\u002F\u002F 没写别名\n",[34,164,166,168,170],{"class":36,"data-line":165,"line":165},7,[34,167,116],{"class":40},[34,169,119],{"class":50},[34,171,123],{"class":122},[34,173,175,177,179,181],{"class":36,"data-line":174,"line":174},8,[34,176,130],{"class":129},[34,178,136],{"class":46},[34,180,140],{"class":139},[34,182,143],{"class":46},[34,184,186],{"class":36,"data-line":185,"line":185},9,[34,187,149],{"class":122},[14,189,190],{"id":190},"message",[10,192,193],{},"定义结构体",[25,195,197],{"className":27,"code":196,"language":29,"meta":30,"style":30},"message MyStruct {\n\t... \u002F\u002F 字段名\n}\n",[21,198,199,211,221],{"__ignoreMap":30},[34,200,201,203,206,208],{"class":36,"data-line":37,"line":37},[34,202,190],{"class":40},[34,204,205],{"class":139}," MyStruct",[34,207,119],{"class":50},[34,209,210],{"class":122},"{\n",[34,212,213,215,218],{"class":36,"data-line":113,"line":113},[34,214,130],{"class":129},[34,216,217],{"class":50},"... ",[34,219,220],{"class":109},"\u002F\u002F 字段名\n",[34,222,223],{"class":36,"data-line":126,"line":126},[34,224,225],{"class":122},"}\n",[10,227,228,229],{},"定义变量，语法：",[21,230,231],{"code":231},"类型 变量名 = 标识符[一般为数字,递增];",[10,233,234],{},"其实我觉得有一点点像C++语法",[236,237,238,251],"table",{},[239,240,241],"thead",{},[242,243,244,248],"tr",{},[245,246,247],"th",{},"类型",[245,249,250],{},"含义",[252,253,254,263,274,285,296,307,315,323,331,339,347],"tbody",{},[242,255,256,260],{},[257,258,259],"td",{},"string",[257,261,262],{},"字符串",[242,264,265,268],{},[257,266,267],{},"int32",[257,269,270,271],{},"32位整型",[34,272,273],{},"2^31",[242,275,276,279],{},[257,277,278],{},"int64",[257,280,281,282],{},"64位整型",[34,283,284],{},"2^63",[242,286,287,290],{},[257,288,289],{},"float",[257,291,292,293],{},"32位精度浮点型",[34,294,295],{},"2^127",[242,297,298,301],{},[257,299,300],{},"double",[257,302,303,304],{},"64位精度浮点型",[34,305,306],{},"2^1023",[242,308,309,312],{},[257,310,311],{},"bool",[257,313,314],{},"布尔",[242,316,317,320],{},[257,318,319],{},"repeated",[257,321,322],{},"切片",[242,324,325,328],{},[257,326,327],{},"map\u003CK,V>",[257,329,330],{},"map",[242,332,333,336],{},[257,334,335],{},"reversed",[257,337,338],{},"保留字",[242,340,341,344],{},[257,342,343],{},"enum",[257,345,346],{},"枚举",[242,348,349,352],{},[257,350,351],{},"oneof",[257,353,354],{},"多选一",[14,356,357],{"id":357},"service",[10,359,360],{},"这是定义方法的地方，主要分为四种",[362,363,364,368,371,374],"ul",{},[365,366,367],"li",{},"即刻响应",[365,369,370],{},"输入流",[365,372,373],{},"输出流",[365,375,376],{},"输入输出流",[25,378,380],{"className":27,"code":379,"language":29,"meta":30,"style":30},"service PersonService {\n    rpc GetPerson (Person) returns (Person); \u002F\u002F 即刻响应\n    rpc GetPersonIn (stream Person) returns (Person); \u002F\u002F 输入以流的形式\n    rpc GetPersonOut (Person) returns (stream Person); \u002F\u002F 输出以流的形式\n    rpc GetPersonIO (stream Person) returns (stream Person); \u002F\u002F 输入输出都以流的形式\n}\n",[21,381,382,393,435,473,509,547],{"__ignoreMap":30},[34,383,384,386,389,391],{"class":36,"data-line":37,"line":37},[34,385,357],{"class":40},[34,387,388],{"class":139}," PersonService",[34,390,119],{"class":50},[34,392,210],{"class":122},[34,394,395,398,401,404,406,410,413,416,418,421,423,425,427,429,432],{"class":36,"data-line":113,"line":113},[34,396,397],{"class":129},"    ",[34,399,400],{"class":40},"rpc",[34,402,403],{"class":139}," GetPerson",[34,405,119],{"class":50},[34,407,409],{"class":408},"sJX2D","(",[34,411,412],{"class":139},"Person",[34,414,415],{"class":408},")",[34,417,119],{"class":50},[34,419,420],{"class":40},"returns",[34,422,119],{"class":50},[34,424,409],{"class":408},[34,426,412],{"class":139},[34,428,415],{"class":408},[34,430,431],{"class":50},"; ",[34,433,434],{"class":109},"\u002F\u002F 即刻响应\n",[34,436,437,439,441,444,446,448,451,454,456,458,460,462,464,466,468,470],{"class":36,"data-line":126,"line":126},[34,438,397],{"class":129},[34,440,400],{"class":40},[34,442,443],{"class":139}," GetPersonIn",[34,445,119],{"class":50},[34,447,409],{"class":408},[34,449,450],{"class":40},"stream",[34,452,453],{"class":139}," Person",[34,455,415],{"class":408},[34,457,119],{"class":50},[34,459,420],{"class":40},[34,461,119],{"class":50},[34,463,409],{"class":408},[34,465,412],{"class":139},[34,467,415],{"class":408},[34,469,431],{"class":50},[34,471,472],{"class":109},"\u002F\u002F 输入以流的形式\n",[34,474,475,477,479,482,484,486,488,490,492,494,496,498,500,502,504,506],{"class":36,"data-line":146,"line":146},[34,476,397],{"class":129},[34,478,400],{"class":40},[34,480,481],{"class":139}," GetPersonOut",[34,483,119],{"class":50},[34,485,409],{"class":408},[34,487,412],{"class":139},[34,489,415],{"class":408},[34,491,119],{"class":50},[34,493,420],{"class":40},[34,495,119],{"class":50},[34,497,409],{"class":408},[34,499,450],{"class":40},[34,501,453],{"class":139},[34,503,415],{"class":408},[34,505,431],{"class":50},[34,507,508],{"class":109},"\u002F\u002F 输出以流的形式\n",[34,510,511,513,515,518,520,522,524,526,528,530,532,534,536,538,540,542,544],{"class":36,"data-line":152,"line":152},[34,512,397],{"class":129},[34,514,400],{"class":40},[34,516,517],{"class":139}," GetPersonIO",[34,519,119],{"class":50},[34,521,409],{"class":408},[34,523,450],{"class":40},[34,525,453],{"class":139},[34,527,415],{"class":408},[34,529,119],{"class":50},[34,531,420],{"class":40},[34,533,119],{"class":50},[34,535,409],{"class":408},[34,537,450],{"class":40},[34,539,453],{"class":139},[34,541,415],{"class":408},[34,543,431],{"class":50},[34,545,546],{"class":109},"\u002F\u002F 输入输出都以流的形式\n",[34,548,549],{"class":36,"data-line":159,"line":159},[34,550,225],{"class":122},[14,552,553],{"id":553},"示例代码",[25,555,557],{"className":27,"code":556,"language":29,"meta":30,"style":30},"syntax = \"proto3\";\n\npackage person;\noption go_package=\"proto-learn\u002Fpb\u002Fperson;person\";\n\nimport \"pb\u002Fuser\u002Fuser.proto\";\n\nmessage Person{\n    string name = 1;\n    int64 age = 2;\n    float height = 3;\n    double weight = 4;\n    bool isMale = 5;\n    repeated string lessons = 6;\n    message Friend {\n        string name = 7;\n    }\n    Friend friend = 8;\n    map\u003Cstring,int64> scores = 9;\n\n    reserved \"reversed_field\"; \u002F\u002F 保留字段\n    reserved 10; \u002F\u002F 保留唯一标识\n    \n    \u002F\u002F 枚举类型\n    enum Subjects{\n        Chinese = 0;\n        Math = 1;\n        English = 2;\n    }\n\n    Subjects subject = 11;\n\n    \u002F\u002F oneof\n    oneof Teacher{\n        string Teacher1 = 12;\n        string Teacher2 = 13;\n        string Teacher3 = 14;\n    }\n\n    user.UserReq req = 15;\n}\n\nservice PersonService {\n    rpc GetPerson (Person) returns (Person); \u002F\u002F 即刻响应\n    rpc GetPersonIn (stream Person) returns (Person); \u002F\u002F 输入以流的形式\n    rpc GetPersonOut (Person) returns (stream Person); \u002F\u002F输出以流的形式\n    rpc GetPersonIO (stream Person) returns (stream Person); \u002F\u002F 输入输出都以流的形式\n}\n",[21,558,559,569,573,582,594,598,607,611,619,635,652,669,686,703,723,737,755,764,782,812,817,833,848,855,863,875,892,908,924,933,938,956,961,969,981,1000,1019,1038,1047,1052,1070,1075,1080,1091,1124,1159,1195,1232],{"__ignoreMap":30},[34,560,561,563,565,567],{"class":36,"data-line":37,"line":37},[34,562,16],{"class":40},[34,564,43],{"class":40},[34,566,47],{"class":46},[34,568,51],{"class":50},[34,570,571],{"class":36,"data-line":113,"line":113},[34,572,156],{"emptyLinePlaceholder":155},[34,574,575,577,580],{"class":36,"data-line":126,"line":126},[34,576,54],{"class":40},[34,578,579],{"class":46}," person",[34,581,51],{"class":50},[34,583,584,586,588,590,592],{"class":36,"data-line":146,"line":146},[34,585,82],{"class":40},[34,587,86],{"class":85},[34,589,89],{"class":40},[34,591,92],{"class":46},[34,593,51],{"class":50},[34,595,596],{"class":36,"data-line":152,"line":152},[34,597,156],{"emptyLinePlaceholder":155},[34,599,600,602,605],{"class":36,"data-line":159,"line":159},[34,601,116],{"class":40},[34,603,604],{"class":46}," \"pb\u002Fuser\u002Fuser.proto\"",[34,606,51],{"class":50},[34,608,609],{"class":36,"data-line":165,"line":165},[34,610,156],{"emptyLinePlaceholder":155},[34,612,613,615,617],{"class":36,"data-line":174,"line":174},[34,614,190],{"class":40},[34,616,453],{"class":139},[34,618,210],{"class":122},[34,620,621,623,625,628,630,633],{"class":36,"data-line":185,"line":185},[34,622,397],{"class":129},[34,624,259],{"class":40},[34,626,627],{"class":50}," name ",[34,629,89],{"class":40},[34,631,632],{"class":85}," 1",[34,634,51],{"class":50},[34,636,638,640,642,645,647,650],{"class":36,"data-line":637,"line":637},10,[34,639,397],{"class":129},[34,641,278],{"class":40},[34,643,644],{"class":50}," age ",[34,646,89],{"class":40},[34,648,649],{"class":85}," 2",[34,651,51],{"class":50},[34,653,655,657,659,662,664,667],{"class":36,"data-line":654,"line":654},11,[34,656,397],{"class":129},[34,658,289],{"class":40},[34,660,661],{"class":50}," height ",[34,663,89],{"class":40},[34,665,666],{"class":85}," 3",[34,668,51],{"class":50},[34,670,672,674,676,679,681,684],{"class":36,"data-line":671,"line":671},12,[34,673,397],{"class":129},[34,675,300],{"class":40},[34,677,678],{"class":50}," weight ",[34,680,89],{"class":40},[34,682,683],{"class":85}," 4",[34,685,51],{"class":50},[34,687,689,691,693,696,698,701],{"class":36,"data-line":688,"line":688},13,[34,690,397],{"class":129},[34,692,311],{"class":40},[34,694,695],{"class":50}," isMale ",[34,697,89],{"class":40},[34,699,700],{"class":85}," 5",[34,702,51],{"class":50},[34,704,706,708,710,713,716,718,721],{"class":36,"data-line":705,"line":705},14,[34,707,397],{"class":129},[34,709,319],{"class":40},[34,711,712],{"class":40}," string",[34,714,715],{"class":50}," lessons ",[34,717,89],{"class":40},[34,719,720],{"class":85}," 6",[34,722,51],{"class":50},[34,724,726,728,730,733,735],{"class":36,"data-line":725,"line":725},15,[34,727,397],{"class":129},[34,729,190],{"class":40},[34,731,732],{"class":139}," Friend",[34,734,119],{"class":50},[34,736,210],{"class":408},[34,738,740,742,744,746,748,750,753],{"class":36,"data-line":739,"line":739},16,[34,741,397],{"class":129},[34,743,397],{"class":129},[34,745,259],{"class":40},[34,747,627],{"class":50},[34,749,89],{"class":40},[34,751,752],{"class":85}," 7",[34,754,51],{"class":50},[34,756,758,760,762],{"class":36,"data-line":757,"line":757},17,[34,759,397],{"class":129},[34,761,30],{"class":50},[34,763,225],{"class":408},[34,765,767,769,772,775,777,780],{"class":36,"data-line":766,"line":766},18,[34,768,397],{"class":129},[34,770,771],{"class":40},"Friend",[34,773,774],{"class":50}," friend ",[34,776,89],{"class":40},[34,778,779],{"class":85}," 8",[34,781,51],{"class":50},[34,783,785,787,789,792,794,797,799,802,805,807,810],{"class":36,"data-line":784,"line":784},19,[34,786,397],{"class":129},[34,788,330],{"class":40},[34,790,791],{"class":50},"\u003C",[34,793,259],{"class":40},[34,795,796],{"class":50},",",[34,798,278],{"class":40},[34,800,801],{"class":50},">",[34,803,804],{"class":50}," scores ",[34,806,89],{"class":40},[34,808,809],{"class":85}," 9",[34,811,51],{"class":50},[34,813,815],{"class":36,"data-line":814,"line":814},20,[34,816,156],{"emptyLinePlaceholder":155},[34,818,820,822,825,828,830],{"class":36,"data-line":819,"line":819},21,[34,821,397],{"class":129},[34,823,824],{"class":40},"reserved",[34,826,827],{"class":46}," \"reversed_field\"",[34,829,431],{"class":50},[34,831,832],{"class":109},"\u002F\u002F 保留字段\n",[34,834,836,838,840,843,845],{"class":36,"data-line":835,"line":835},22,[34,837,397],{"class":129},[34,839,824],{"class":40},[34,841,842],{"class":85}," 10",[34,844,431],{"class":50},[34,846,847],{"class":109},"\u002F\u002F 保留唯一标识\n",[34,849,851,853],{"class":36,"data-line":850,"line":850},23,[34,852,397],{"class":129},[34,854],{"class":50},[34,856,858,860],{"class":36,"data-line":857,"line":857},24,[34,859,397],{"class":129},[34,861,862],{"class":109},"\u002F\u002F 枚举类型\n",[34,864,866,868,870,873],{"class":36,"data-line":865,"line":865},25,[34,867,397],{"class":129},[34,869,343],{"class":40},[34,871,872],{"class":139}," Subjects",[34,874,210],{"class":408},[34,876,878,880,882,885,887,890],{"class":36,"data-line":877,"line":877},26,[34,879,397],{"class":129},[34,881,397],{"class":129},[34,883,884],{"class":50},"Chinese ",[34,886,89],{"class":40},[34,888,889],{"class":85}," 0",[34,891,51],{"class":50},[34,893,895,897,899,902,904,906],{"class":36,"data-line":894,"line":894},27,[34,896,397],{"class":129},[34,898,397],{"class":129},[34,900,901],{"class":50},"Math ",[34,903,89],{"class":40},[34,905,632],{"class":85},[34,907,51],{"class":50},[34,909,911,913,915,918,920,922],{"class":36,"data-line":910,"line":910},28,[34,912,397],{"class":129},[34,914,397],{"class":129},[34,916,917],{"class":50},"English ",[34,919,89],{"class":40},[34,921,649],{"class":85},[34,923,51],{"class":50},[34,925,927,929,931],{"class":36,"data-line":926,"line":926},29,[34,928,397],{"class":129},[34,930,30],{"class":50},[34,932,225],{"class":408},[34,934,936],{"class":36,"data-line":935,"line":935},30,[34,937,156],{"emptyLinePlaceholder":155},[34,939,941,943,946,949,951,954],{"class":36,"data-line":940,"line":940},31,[34,942,397],{"class":129},[34,944,945],{"class":40},"Subjects",[34,947,948],{"class":50}," subject ",[34,950,89],{"class":40},[34,952,953],{"class":85}," 11",[34,955,51],{"class":50},[34,957,959],{"class":36,"data-line":958,"line":958},32,[34,960,156],{"emptyLinePlaceholder":155},[34,962,964,966],{"class":36,"data-line":963,"line":963},33,[34,965,397],{"class":129},[34,967,968],{"class":109},"\u002F\u002F oneof\n",[34,970,972,974,976,979],{"class":36,"data-line":971,"line":971},34,[34,973,397],{"class":129},[34,975,351],{"class":40},[34,977,978],{"class":50}," Teacher",[34,980,210],{"class":408},[34,982,984,986,988,990,993,995,998],{"class":36,"data-line":983,"line":983},35,[34,985,397],{"class":129},[34,987,397],{"class":129},[34,989,259],{"class":40},[34,991,992],{"class":50}," Teacher1 ",[34,994,89],{"class":40},[34,996,997],{"class":85}," 12",[34,999,51],{"class":50},[34,1001,1003,1005,1007,1009,1012,1014,1017],{"class":36,"data-line":1002,"line":1002},36,[34,1004,397],{"class":129},[34,1006,397],{"class":129},[34,1008,259],{"class":40},[34,1010,1011],{"class":50}," Teacher2 ",[34,1013,89],{"class":40},[34,1015,1016],{"class":85}," 13",[34,1018,51],{"class":50},[34,1020,1022,1024,1026,1028,1031,1033,1036],{"class":36,"data-line":1021,"line":1021},37,[34,1023,397],{"class":129},[34,1025,397],{"class":129},[34,1027,259],{"class":40},[34,1029,1030],{"class":50}," Teacher3 ",[34,1032,89],{"class":40},[34,1034,1035],{"class":85}," 14",[34,1037,51],{"class":50},[34,1039,1041,1043,1045],{"class":36,"data-line":1040,"line":1040},38,[34,1042,397],{"class":129},[34,1044,30],{"class":50},[34,1046,225],{"class":408},[34,1048,1050],{"class":36,"data-line":1049,"line":1049},39,[34,1051,156],{"emptyLinePlaceholder":155},[34,1053,1055,1057,1060,1063,1065,1068],{"class":36,"data-line":1054,"line":1054},40,[34,1056,397],{"class":129},[34,1058,1059],{"class":40},"user.UserReq",[34,1061,1062],{"class":50}," req ",[34,1064,89],{"class":40},[34,1066,1067],{"class":85}," 15",[34,1069,51],{"class":50},[34,1071,1073],{"class":36,"data-line":1072,"line":1072},41,[34,1074,225],{"class":122},[34,1076,1078],{"class":36,"data-line":1077,"line":1077},42,[34,1079,156],{"emptyLinePlaceholder":155},[34,1081,1083,1085,1087,1089],{"class":36,"data-line":1082,"line":1082},43,[34,1084,357],{"class":40},[34,1086,388],{"class":139},[34,1088,119],{"class":50},[34,1090,210],{"class":122},[34,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122],{"class":36,"data-line":1093,"line":1093},44,[34,1095,397],{"class":129},[34,1097,400],{"class":40},[34,1099,403],{"class":139},[34,1101,119],{"class":50},[34,1103,409],{"class":408},[34,1105,412],{"class":139},[34,1107,415],{"class":408},[34,1109,119],{"class":50},[34,1111,420],{"class":40},[34,1113,119],{"class":50},[34,1115,409],{"class":408},[34,1117,412],{"class":139},[34,1119,415],{"class":408},[34,1121,431],{"class":50},[34,1123,434],{"class":109},[34,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157],{"class":36,"data-line":1126,"line":1126},45,[34,1128,397],{"class":129},[34,1130,400],{"class":40},[34,1132,443],{"class":139},[34,1134,119],{"class":50},[34,1136,409],{"class":408},[34,1138,450],{"class":40},[34,1140,453],{"class":139},[34,1142,415],{"class":408},[34,1144,119],{"class":50},[34,1146,420],{"class":40},[34,1148,119],{"class":50},[34,1150,409],{"class":408},[34,1152,412],{"class":139},[34,1154,415],{"class":408},[34,1156,431],{"class":50},[34,1158,472],{"class":109},[34,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192],{"class":36,"data-line":1161,"line":1161},46,[34,1163,397],{"class":129},[34,1165,400],{"class":40},[34,1167,481],{"class":139},[34,1169,119],{"class":50},[34,1171,409],{"class":408},[34,1173,412],{"class":139},[34,1175,415],{"class":408},[34,1177,119],{"class":50},[34,1179,420],{"class":40},[34,1181,119],{"class":50},[34,1183,409],{"class":408},[34,1185,450],{"class":40},[34,1187,453],{"class":139},[34,1189,415],{"class":408},[34,1191,431],{"class":50},[34,1193,1194],{"class":109},"\u002F\u002F输出以流的形式\n",[34,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230],{"class":36,"data-line":1197,"line":1197},47,[34,1199,397],{"class":129},[34,1201,400],{"class":40},[34,1203,517],{"class":139},[34,1205,119],{"class":50},[34,1207,409],{"class":408},[34,1209,450],{"class":40},[34,1211,453],{"class":139},[34,1213,415],{"class":408},[34,1215,119],{"class":50},[34,1217,420],{"class":40},[34,1219,119],{"class":50},[34,1221,409],{"class":408},[34,1223,450],{"class":40},[34,1225,453],{"class":139},[34,1227,415],{"class":408},[34,1229,431],{"class":50},[34,1231,546],{"class":109},[34,1233,1235],{"class":36,"data-line":1234,"line":1234},48,[34,1236,225],{"class":122},[14,1238,1239],{"id":1239},"命令行生成",[10,1241,1242],{},"编写makefile脚本",[25,1244,1248],{"className":1245,"code":1246,"language":1247,"meta":30,"style":30},"language-makefile shiki shiki-themes github-light github-dark",".PHONY: gen-user gen-person\n\ngen-user:\n\tprotoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative .\u002Fpb\u002Fuser\u002Fuser.proto\n\ngen-person:\n\tprotoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative .\u002Fpb\u002Fperson\u002Fperson.proto\n","makefile",[21,1249,1250,1258,1262,1270,1277,1281,1288],{"__ignoreMap":30},[34,1251,1252,1255],{"class":36,"data-line":37,"line":37},[34,1253,1254],{"class":85},".PHONY",[34,1256,1257],{"class":50},": gen-user gen-person\n",[34,1259,1260],{"class":36,"data-line":113,"line":113},[34,1261,156],{"emptyLinePlaceholder":155},[34,1263,1264,1267],{"class":36,"data-line":126,"line":126},[34,1265,1266],{"class":139},"gen-user",[34,1268,1269],{"class":50},":\n",[34,1271,1272,1274],{"class":36,"data-line":146,"line":146},[34,1273,130],{"class":129},[34,1275,1276],{"class":50},"protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative .\u002Fpb\u002Fuser\u002Fuser.proto\n",[34,1278,1279],{"class":36,"data-line":152,"line":152},[34,1280,156],{"emptyLinePlaceholder":155},[34,1282,1283,1286],{"class":36,"data-line":159,"line":159},[34,1284,1285],{"class":139},"gen-person",[34,1287,1269],{"class":50},[34,1289,1290,1292],{"class":36,"data-line":165,"line":165},[34,1291,130],{"class":129},[34,1293,1294],{"class":50},"protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative .\u002Fpb\u002Fperson\u002Fperson.proto\n",[10,1296,1297,1298,1301],{},"执行",[21,1299,1300],{"code":1300},"make gen-person","即可生成",[10,1303,1304],{},"现在我来解释一下命令行的各个参数，在学习的时候也踩了很多坑",[362,1306,1307,1313,1319,1325],{},[365,1308,1309,1312],{},[21,1310,1311],{"code":1311},"--go_out",": pb.go生成的相对目录",[365,1314,1315,1318],{},[21,1316,1317],{"code":1317},"--go-grpc_out",": grpc.pb.go生成的相对目录",[365,1320,1321,1324],{},[21,1322,1323],{"code":1323},"--go_opt=paths=source_relative",": 如果不写的话，默认生成的是go_package的目录，这样写的话就和proto定义的位置一致",[365,1326,1327,1324],{},[21,1328,1329],{"code":1329},"--go-grpc_opt=paths=source_relative",[14,1331,1332],{"id":1332},"oneof语法",[10,1334,1335,1336,1338],{},"在proto语法当中",[21,1337,351],{"code":351},"关键字比较特殊，代表多选一",[10,1340,1341,1342,1344],{},"实际上就是定义proto时不确定使用什么字段，设置",[21,1343,351],{"code":351},"，本质上类似Go语法当中的枚举类型",[10,1346,1347],{},"举个例子",[10,1349,1350],{},"如果我的博客文章更新了，既可以选择短信推送也可以选择邮件推送",[10,1352,1353,1354],{},"可以这样定义",[21,1355,29],{"code":29},[25,1357,1359],{"className":27,"code":1358,"language":29,"meta":30,"style":30},"syntax = \"proto3\";\n\noption go_package=\"hello\u002Fpb;pb\";\n\npackage pb;\n\nmessage NoticeRequest {\n    string msg = 1;\n    oneof msg_type {\n        string phone = 2;\n        string email = 3;\n    }\n}\n\nmessage NoticeResponse {\n    string msg = 1;\n}\n\nservice NoticeService {\n    rpc Notice (NoticeRequest) returns (NoticeResponse);\n}\n",[21,1360,1361,1371,1375,1388,1392,1401,1405,1416,1431,1442,1459,1476,1484,1488,1492,1503,1517,1521,1525,1536,1569],{"__ignoreMap":30},[34,1362,1363,1365,1367,1369],{"class":36,"data-line":37,"line":37},[34,1364,16],{"class":40},[34,1366,43],{"class":40},[34,1368,47],{"class":46},[34,1370,51],{"class":50},[34,1372,1373],{"class":36,"data-line":113,"line":113},[34,1374,156],{"emptyLinePlaceholder":155},[34,1376,1377,1379,1381,1383,1386],{"class":36,"data-line":126,"line":126},[34,1378,82],{"class":40},[34,1380,86],{"class":85},[34,1382,89],{"class":40},[34,1384,1385],{"class":46},"\"hello\u002Fpb;pb\"",[34,1387,51],{"class":50},[34,1389,1390],{"class":36,"data-line":146,"line":146},[34,1391,156],{"emptyLinePlaceholder":155},[34,1393,1394,1396,1399],{"class":36,"data-line":152,"line":152},[34,1395,54],{"class":40},[34,1397,1398],{"class":46}," pb",[34,1400,51],{"class":50},[34,1402,1403],{"class":36,"data-line":159,"line":159},[34,1404,156],{"emptyLinePlaceholder":155},[34,1406,1407,1409,1412,1414],{"class":36,"data-line":165,"line":165},[34,1408,190],{"class":40},[34,1410,1411],{"class":139}," NoticeRequest",[34,1413,119],{"class":50},[34,1415,210],{"class":122},[34,1417,1418,1420,1422,1425,1427,1429],{"class":36,"data-line":174,"line":174},[34,1419,397],{"class":129},[34,1421,259],{"class":40},[34,1423,1424],{"class":50}," msg ",[34,1426,89],{"class":40},[34,1428,632],{"class":85},[34,1430,51],{"class":50},[34,1432,1433,1435,1437,1440],{"class":36,"data-line":185,"line":185},[34,1434,397],{"class":129},[34,1436,351],{"class":40},[34,1438,1439],{"class":50}," msg_type ",[34,1441,210],{"class":408},[34,1443,1444,1446,1448,1450,1453,1455,1457],{"class":36,"data-line":637,"line":637},[34,1445,397],{"class":129},[34,1447,397],{"class":129},[34,1449,259],{"class":40},[34,1451,1452],{"class":50}," phone ",[34,1454,89],{"class":40},[34,1456,649],{"class":85},[34,1458,51],{"class":50},[34,1460,1461,1463,1465,1467,1470,1472,1474],{"class":36,"data-line":654,"line":654},[34,1462,397],{"class":129},[34,1464,397],{"class":129},[34,1466,259],{"class":40},[34,1468,1469],{"class":50}," email ",[34,1471,89],{"class":40},[34,1473,666],{"class":85},[34,1475,51],{"class":50},[34,1477,1478,1480,1482],{"class":36,"data-line":671,"line":671},[34,1479,397],{"class":129},[34,1481,30],{"class":50},[34,1483,225],{"class":408},[34,1485,1486],{"class":36,"data-line":688,"line":688},[34,1487,225],{"class":122},[34,1489,1490],{"class":36,"data-line":705,"line":705},[34,1491,156],{"emptyLinePlaceholder":155},[34,1493,1494,1496,1499,1501],{"class":36,"data-line":725,"line":725},[34,1495,190],{"class":40},[34,1497,1498],{"class":139}," NoticeResponse",[34,1500,119],{"class":50},[34,1502,210],{"class":122},[34,1504,1505,1507,1509,1511,1513,1515],{"class":36,"data-line":739,"line":739},[34,1506,397],{"class":129},[34,1508,259],{"class":40},[34,1510,1424],{"class":50},[34,1512,89],{"class":40},[34,1514,632],{"class":85},[34,1516,51],{"class":50},[34,1518,1519],{"class":36,"data-line":757,"line":757},[34,1520,225],{"class":122},[34,1522,1523],{"class":36,"data-line":766,"line":766},[34,1524,156],{"emptyLinePlaceholder":155},[34,1526,1527,1529,1532,1534],{"class":36,"data-line":784,"line":784},[34,1528,357],{"class":40},[34,1530,1531],{"class":139}," NoticeService",[34,1533,119],{"class":50},[34,1535,210],{"class":122},[34,1537,1538,1540,1542,1545,1547,1549,1552,1554,1556,1558,1560,1562,1565,1567],{"class":36,"data-line":814,"line":814},[34,1539,397],{"class":129},[34,1541,400],{"class":40},[34,1543,1544],{"class":139}," Notice",[34,1546,119],{"class":50},[34,1548,409],{"class":408},[34,1550,1551],{"class":139},"NoticeRequest",[34,1553,415],{"class":408},[34,1555,119],{"class":50},[34,1557,420],{"class":40},[34,1559,119],{"class":50},[34,1561,409],{"class":408},[34,1563,1564],{"class":139},"NoticeResponse",[34,1566,415],{"class":408},[34,1568,51],{"class":50},[34,1570,1571],{"class":36,"data-line":819,"line":819},[34,1572,225],{"class":122},[10,1574,1575],{},"定义server端代码",[25,1577,1579],{"className":100,"code":1578,"language":102,"meta":30,"style":30},"type NoticeServer struct {\n\tpb.UnimplementedNoticeServiceServer\n}\n\nfunc (s *NoticeServer) Notice(ctx context.Context, req *pb.NoticeRequest) (*pb.NoticeResponse, error) {\n\tsend_msg := req.Msg\n\tswitch req.MsgType.(type) { \u002F\u002F 类型断言\n\tcase *pb.NoticeRequest_Email:\n\t\tsend_msg += \" send by email:\" + req.GetEmail()\n\tcase *pb.NoticeRequest_Phone:\n\t\tsend_msg += \" send by phone\" + req.GetPhone()\n\t}\n\n\treturn &pb.NoticeResponse{\n\t\tMsg: send_msg,\n\t}, nil\n}\n",[21,1580,1581,1596,1609,1613,1617,1696,1709,1735,1753,1781,1798,1822,1830,1834,1852,1861,1875],{"__ignoreMap":30},[34,1582,1583,1586,1589,1592,1594],{"class":36,"data-line":37,"line":37},[34,1584,1585],{"class":40},"type",[34,1587,1588],{"class":139}," NoticeServer",[34,1590,1591],{"class":40}," struct",[34,1593,119],{"class":50},[34,1595,210],{"class":122},[34,1597,1598,1600,1603,1606],{"class":36,"data-line":113,"line":113},[34,1599,130],{"class":129},[34,1601,1602],{"class":139},"pb",[34,1604,1605],{"class":50},".",[34,1607,1608],{"class":139},"UnimplementedNoticeServiceServer\n",[34,1610,1611],{"class":36,"data-line":126,"line":126},[34,1612,225],{"class":122},[34,1614,1615],{"class":36,"data-line":146,"line":146},[34,1616,156],{"emptyLinePlaceholder":155},[34,1618,1619,1622,1624,1626,1630,1633,1636,1638,1640,1643,1645,1648,1651,1653,1656,1659,1662,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1690,1692,1694],{"class":36,"data-line":152,"line":152},[34,1620,1621],{"class":40},"func",[34,1623,119],{"class":50},[34,1625,409],{"class":122},[34,1627,1629],{"class":1628},"s4XuR","s ",[34,1631,1632],{"class":40},"*",[34,1634,1635],{"class":139},"NoticeServer",[34,1637,415],{"class":122},[34,1639,119],{"class":50},[34,1641,1642],{"class":139},"Notice",[34,1644,409],{"class":122},[34,1646,1647],{"class":1628},"ctx",[34,1649,1650],{"class":139}," context",[34,1652,1605],{"class":50},[34,1654,1655],{"class":139},"Context",[34,1657,1658],{"class":50},", ",[34,1660,1661],{"class":1628},"req",[34,1663,1664],{"class":40}," *",[34,1666,1602],{"class":139},[34,1668,1605],{"class":50},[34,1670,1551],{"class":139},[34,1672,415],{"class":122},[34,1674,119],{"class":50},[34,1676,409],{"class":122},[34,1678,1632],{"class":40},[34,1680,1602],{"class":139},[34,1682,1605],{"class":50},[34,1684,1564],{"class":139},[34,1686,1658],{"class":50},[34,1688,1689],{"class":40},"error",[34,1691,415],{"class":122},[34,1693,119],{"class":50},[34,1695,210],{"class":122},[34,1697,1698,1700,1703,1706],{"class":36,"data-line":159,"line":159},[34,1699,130],{"class":129},[34,1701,1702],{"class":50},"send_msg ",[34,1704,1705],{"class":40},":=",[34,1707,1708],{"class":50}," req.Msg\n",[34,1710,1711,1713,1716,1719,1721,1723,1725,1727,1730,1732],{"class":36,"data-line":165,"line":165},[34,1712,130],{"class":129},[34,1714,1715],{"class":40},"switch",[34,1717,1718],{"class":50}," req.MsgType.",[34,1720,409],{"class":408},[34,1722,1585],{"class":40},[34,1724,415],{"class":408},[34,1726,119],{"class":50},[34,1728,1729],{"class":408},"{",[34,1731,119],{"class":50},[34,1733,1734],{"class":109},"\u002F\u002F 类型断言\n",[34,1736,1737,1739,1742,1744,1746,1748,1751],{"class":36,"data-line":174,"line":174},[34,1738,130],{"class":129},[34,1740,1741],{"class":40},"case",[34,1743,1664],{"class":40},[34,1745,1602],{"class":139},[34,1747,1605],{"class":50},[34,1749,1750],{"class":139},"NoticeRequest_Email",[34,1752,1269],{"class":50},[34,1754,1755,1757,1759,1761,1764,1767,1770,1773,1776,1779],{"class":36,"data-line":185,"line":185},[34,1756,130],{"class":129},[34,1758,130],{"class":129},[34,1760,1702],{"class":50},[34,1762,1763],{"class":40},"+=",[34,1765,1766],{"class":46}," \" send by email:\"",[34,1768,1769],{"class":40}," +",[34,1771,1772],{"class":50}," req.",[34,1774,1775],{"class":139},"GetEmail",[34,1777,409],{"class":1778},"sqkie",[34,1780,149],{"class":1778},[34,1782,1783,1785,1787,1789,1791,1793,1796],{"class":36,"data-line":637,"line":637},[34,1784,130],{"class":129},[34,1786,1741],{"class":40},[34,1788,1664],{"class":40},[34,1790,1602],{"class":139},[34,1792,1605],{"class":50},[34,1794,1795],{"class":139},"NoticeRequest_Phone",[34,1797,1269],{"class":50},[34,1799,1800,1802,1804,1806,1808,1811,1813,1815,1818,1820],{"class":36,"data-line":654,"line":654},[34,1801,130],{"class":129},[34,1803,130],{"class":129},[34,1805,1702],{"class":50},[34,1807,1763],{"class":40},[34,1809,1810],{"class":46}," \" send by phone\"",[34,1812,1769],{"class":40},[34,1814,1772],{"class":50},[34,1816,1817],{"class":139},"GetPhone",[34,1819,409],{"class":1778},[34,1821,149],{"class":1778},[34,1823,1824,1826,1828],{"class":36,"data-line":671,"line":671},[34,1825,130],{"class":129},[34,1827,30],{"class":50},[34,1829,225],{"class":408},[34,1831,1832],{"class":36,"data-line":688,"line":688},[34,1833,156],{"emptyLinePlaceholder":155},[34,1835,1836,1838,1841,1844,1846,1848,1850],{"class":36,"data-line":705,"line":705},[34,1837,130],{"class":129},[34,1839,1840],{"class":40},"return",[34,1842,1843],{"class":40}," &",[34,1845,1602],{"class":139},[34,1847,1605],{"class":50},[34,1849,1564],{"class":139},[34,1851,210],{"class":408},[34,1853,1854,1856,1858],{"class":36,"data-line":725,"line":725},[34,1855,130],{"class":129},[34,1857,130],{"class":129},[34,1859,1860],{"class":50},"Msg: send_msg,\n",[34,1862,1863,1865,1867,1870,1872],{"class":36,"data-line":739,"line":739},[34,1864,130],{"class":129},[34,1866,30],{"class":50},[34,1868,1869],{"class":408},"}",[34,1871,1658],{"class":50},[34,1873,1874],{"class":85},"nil\n",[34,1876,1877],{"class":36,"data-line":757,"line":757},[34,1878,225],{"class":122},[10,1880,1881,1882,1886],{},"根据传过来的值进行",[1883,1884,1885],"strong",{},"类型断言","后继续处理",[10,1888,1889],{},"定义client端代码",[25,1891,1893],{"className":100,"code":1892,"language":102,"meta":30,"style":30},"\u002F\u002F notice\nnoticeResp, err := noticeClient.Notice(ctx, &pb.NoticeRequest{Msg: *msg, MsgType: &pb.NoticeRequest_Phone{\n\tPhone: \"15811111111\",\n}})\nif err != nil {\n\tlog.Fatalf(\"failed to call Notice[phone]: %v\", err)\n}\nlog.Printf(\"Response: %s\", noticeResp.Msg)\n\nnoticeResp, err = noticeClient.Notice(ctx, &pb.NoticeRequest{Msg: *msg, MsgType: &pb.NoticeRequest_Email{\n\tEmail: \"email@codepzj.cn\",\n}})\nif err != nil {\n\tlog.Fatalf(\"failed to call Notice[email]: %v\", err)\n}\nlog.Printf(\"Response: %s\", noticeResp.Msg)\n",[21,1894,1895,1900,1946,1959,1967,1985,2010,2014,2036,2040,2080,2092,2100,2114,2135,2139],{"__ignoreMap":30},[34,1896,1897],{"class":36,"data-line":37,"line":37},[34,1898,1899],{"class":109},"\u002F\u002F notice\n",[34,1901,1902,1905,1907,1910,1912,1914,1917,1920,1922,1924,1926,1928,1931,1933,1936,1938,1940,1942,1944],{"class":36,"data-line":113,"line":113},[34,1903,1904],{"class":50},"noticeResp, err ",[34,1906,1705],{"class":40},[34,1908,1909],{"class":50}," noticeClient.",[34,1911,1642],{"class":139},[34,1913,409],{"class":122},[34,1915,1916],{"class":50},"ctx, ",[34,1918,1919],{"class":40},"&",[34,1921,1602],{"class":139},[34,1923,1605],{"class":50},[34,1925,1551],{"class":139},[34,1927,1729],{"class":408},[34,1929,1930],{"class":50},"Msg: ",[34,1932,1632],{"class":40},[34,1934,1935],{"class":50},"msg, MsgType: ",[34,1937,1919],{"class":40},[34,1939,1602],{"class":139},[34,1941,1605],{"class":50},[34,1943,1795],{"class":139},[34,1945,210],{"class":1778},[34,1947,1948,1950,1953,1956],{"class":36,"data-line":126,"line":126},[34,1949,130],{"class":129},[34,1951,1952],{"class":50},"Phone: ",[34,1954,1955],{"class":46},"\"15811111111\"",[34,1957,1958],{"class":50},",\n",[34,1960,1961,1963,1965],{"class":36,"data-line":146,"line":146},[34,1962,1869],{"class":1778},[34,1964,1869],{"class":408},[34,1966,149],{"class":122},[34,1968,1969,1972,1975,1978,1981,1983],{"class":36,"data-line":152,"line":152},[34,1970,1971],{"class":40},"if",[34,1973,1974],{"class":50}," err ",[34,1976,1977],{"class":40},"!=",[34,1979,1980],{"class":85}," nil",[34,1982,119],{"class":50},[34,1984,210],{"class":122},[34,1986,1987,1989,1992,1995,1997,2000,2003,2005,2008],{"class":36,"data-line":159,"line":159},[34,1988,130],{"class":129},[34,1990,1991],{"class":50},"log.",[34,1993,1994],{"class":139},"Fatalf",[34,1996,409],{"class":408},[34,1998,1999],{"class":46},"\"failed to call Notice[phone]: ",[34,2001,2002],{"class":85},"%v",[34,2004,136],{"class":46},[34,2006,2007],{"class":50},", err",[34,2009,149],{"class":408},[34,2011,2012],{"class":36,"data-line":165,"line":165},[34,2013,225],{"class":122},[34,2015,2016,2018,2021,2023,2026,2029,2031,2034],{"class":36,"data-line":174,"line":174},[34,2017,1991],{"class":50},[34,2019,2020],{"class":139},"Printf",[34,2022,409],{"class":122},[34,2024,2025],{"class":46},"\"Response: ",[34,2027,2028],{"class":85},"%s",[34,2030,136],{"class":46},[34,2032,2033],{"class":50},", noticeResp.Msg",[34,2035,149],{"class":122},[34,2037,2038],{"class":36,"data-line":185,"line":185},[34,2039,156],{"emptyLinePlaceholder":155},[34,2041,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078],{"class":36,"data-line":637,"line":637},[34,2043,1904],{"class":50},[34,2045,89],{"class":40},[34,2047,1909],{"class":50},[34,2049,1642],{"class":139},[34,2051,409],{"class":122},[34,2053,1916],{"class":50},[34,2055,1919],{"class":40},[34,2057,1602],{"class":139},[34,2059,1605],{"class":50},[34,2061,1551],{"class":139},[34,2063,1729],{"class":408},[34,2065,1930],{"class":50},[34,2067,1632],{"class":40},[34,2069,1935],{"class":50},[34,2071,1919],{"class":40},[34,2073,1602],{"class":139},[34,2075,1605],{"class":50},[34,2077,1750],{"class":139},[34,2079,210],{"class":1778},[34,2081,2082,2084,2087,2090],{"class":36,"data-line":654,"line":654},[34,2083,130],{"class":129},[34,2085,2086],{"class":50},"Email: ",[34,2088,2089],{"class":46},"\"email@codepzj.cn\"",[34,2091,1958],{"class":50},[34,2093,2094,2096,2098],{"class":36,"data-line":671,"line":671},[34,2095,1869],{"class":1778},[34,2097,1869],{"class":408},[34,2099,149],{"class":122},[34,2101,2102,2104,2106,2108,2110,2112],{"class":36,"data-line":688,"line":688},[34,2103,1971],{"class":40},[34,2105,1974],{"class":50},[34,2107,1977],{"class":40},[34,2109,1980],{"class":85},[34,2111,119],{"class":50},[34,2113,210],{"class":122},[34,2115,2116,2118,2120,2122,2124,2127,2129,2131,2133],{"class":36,"data-line":705,"line":705},[34,2117,130],{"class":129},[34,2119,1991],{"class":50},[34,2121,1994],{"class":139},[34,2123,409],{"class":408},[34,2125,2126],{"class":46},"\"failed to call Notice[email]: ",[34,2128,2002],{"class":85},[34,2130,136],{"class":46},[34,2132,2007],{"class":50},[34,2134,149],{"class":408},[34,2136,2137],{"class":36,"data-line":725,"line":725},[34,2138,225],{"class":122},[34,2140,2141,2143,2145,2147,2149,2151,2153,2155],{"class":36,"data-line":739,"line":739},[34,2142,1991],{"class":50},[34,2144,2020],{"class":139},[34,2146,409],{"class":122},[34,2148,2025],{"class":46},[34,2150,2028],{"class":85},[34,2152,136],{"class":46},[34,2154,2033],{"class":50},[34,2156,149],{"class":122},[10,2158,2159],{},"可以定义phone和email两种不同的请求信息",[14,2161,2163],{"id":2162},"wrappervalue和optional","WrapperValue和optional",[10,2165,2166,2167,2169],{},"对于Go语言来说，如果对于",[21,2168,267],{"code":267},"类型来说，传参为0和不传参得到的零值都为0，怎么判断这个参数传没传呢？",[10,2171,2172,2173],{},"答案是使用",[1883,2174,2175],{},"结构体和指针",[10,2177,2178,2179,2182,2183,2186],{},"在protobuf当中对应",[21,2180,2181],{"code":2181},"WrapperValue","和",[21,2184,2185],{"code":2185},"optional","两个关键字",[10,2188,2189],{},"protobuf v3在删除required的同时把optional也一起删除了（v3.15.0又加回来了），这使得我们没办法轻易判断某些字段究竟是未赋值还是其被赋值为零值。",[2191,2192,2193],"blockquote",{},[10,2194,2195],{},"WrapperValue适用于v3.15之前的版本，optional适合v3.15之后的版本，不过现在的protoc都v33了😂",[10,2197,2198,2199,2202],{},"WrapperValue位于protoc的include目录下的",[21,2200,2201],{"code":2201},"google\u002Fprotobuf\u002Fwrappers.proto","中",[2204,2205,553],"h3",{"id":2206},"示例代码-1",[2208,2209,29],"h4",{"id":29},[25,2211,2213],{"className":27,"code":2212,"language":29,"meta":30,"style":30},"syntax = \"proto3\";\n\noption go_package = \"hello\u002Fpb;pb\";\n\nimport \"google\u002Fprotobuf\u002Fwrappers.proto\";\n\nmessage BookRequest {\n    string name = 1;\n    google.protobuf.Int32Value price = 2;\n    optional string author = 3;\n}\n\nmessage BookResponse {\n    string msg = 1;\n}\n\nservice BookService {\n    rpc Buy (BookRequest) returns (BookResponse);\n}\n",[21,2214,2215,2225,2229,2242,2246,2255,2259,2270,2284,2300,2317,2321,2325,2336,2350,2354,2358,2369,2402],{"__ignoreMap":30},[34,2216,2217,2219,2221,2223],{"class":36,"data-line":37,"line":37},[34,2218,16],{"class":40},[34,2220,43],{"class":40},[34,2222,47],{"class":46},[34,2224,51],{"class":50},[34,2226,2227],{"class":36,"data-line":113,"line":113},[34,2228,156],{"emptyLinePlaceholder":155},[34,2230,2231,2233,2235,2237,2240],{"class":36,"data-line":126,"line":126},[34,2232,82],{"class":40},[34,2234,86],{"class":85},[34,2236,43],{"class":40},[34,2238,2239],{"class":46}," \"hello\u002Fpb;pb\"",[34,2241,51],{"class":50},[34,2243,2244],{"class":36,"data-line":146,"line":146},[34,2245,156],{"emptyLinePlaceholder":155},[34,2247,2248,2250,2253],{"class":36,"data-line":152,"line":152},[34,2249,116],{"class":40},[34,2251,2252],{"class":46}," \"google\u002Fprotobuf\u002Fwrappers.proto\"",[34,2254,51],{"class":50},[34,2256,2257],{"class":36,"data-line":159,"line":159},[34,2258,156],{"emptyLinePlaceholder":155},[34,2260,2261,2263,2266,2268],{"class":36,"data-line":165,"line":165},[34,2262,190],{"class":40},[34,2264,2265],{"class":139}," BookRequest",[34,2267,119],{"class":50},[34,2269,210],{"class":122},[34,2271,2272,2274,2276,2278,2280,2282],{"class":36,"data-line":174,"line":174},[34,2273,397],{"class":129},[34,2275,259],{"class":40},[34,2277,627],{"class":50},[34,2279,89],{"class":40},[34,2281,632],{"class":85},[34,2283,51],{"class":50},[34,2285,2286,2288,2291,2294,2296,2298],{"class":36,"data-line":185,"line":185},[34,2287,397],{"class":129},[34,2289,2290],{"class":40},"google.protobuf.Int32Value",[34,2292,2293],{"class":50}," price ",[34,2295,89],{"class":40},[34,2297,649],{"class":85},[34,2299,51],{"class":50},[34,2301,2302,2304,2306,2308,2311,2313,2315],{"class":36,"data-line":637,"line":637},[34,2303,397],{"class":129},[34,2305,2185],{"class":40},[34,2307,712],{"class":40},[34,2309,2310],{"class":50}," author ",[34,2312,89],{"class":40},[34,2314,666],{"class":85},[34,2316,51],{"class":50},[34,2318,2319],{"class":36,"data-line":654,"line":654},[34,2320,225],{"class":122},[34,2322,2323],{"class":36,"data-line":671,"line":671},[34,2324,156],{"emptyLinePlaceholder":155},[34,2326,2327,2329,2332,2334],{"class":36,"data-line":688,"line":688},[34,2328,190],{"class":40},[34,2330,2331],{"class":139}," BookResponse",[34,2333,119],{"class":50},[34,2335,210],{"class":122},[34,2337,2338,2340,2342,2344,2346,2348],{"class":36,"data-line":705,"line":705},[34,2339,397],{"class":129},[34,2341,259],{"class":40},[34,2343,1424],{"class":50},[34,2345,89],{"class":40},[34,2347,632],{"class":85},[34,2349,51],{"class":50},[34,2351,2352],{"class":36,"data-line":725,"line":725},[34,2353,225],{"class":122},[34,2355,2356],{"class":36,"data-line":739,"line":739},[34,2357,156],{"emptyLinePlaceholder":155},[34,2359,2360,2362,2365,2367],{"class":36,"data-line":757,"line":757},[34,2361,357],{"class":40},[34,2363,2364],{"class":139}," BookService",[34,2366,119],{"class":50},[34,2368,210],{"class":122},[34,2370,2371,2373,2375,2378,2380,2382,2385,2387,2389,2391,2393,2395,2398,2400],{"class":36,"data-line":766,"line":766},[34,2372,397],{"class":129},[34,2374,400],{"class":40},[34,2376,2377],{"class":139}," Buy",[34,2379,119],{"class":50},[34,2381,409],{"class":408},[34,2383,2384],{"class":139},"BookRequest",[34,2386,415],{"class":408},[34,2388,119],{"class":50},[34,2390,420],{"class":40},[34,2392,119],{"class":50},[34,2394,409],{"class":408},[34,2396,2397],{"class":139},"BookResponse",[34,2399,415],{"class":408},[34,2401,51],{"class":50},[34,2403,2404],{"class":36,"data-line":784,"line":784},[34,2405,225],{"class":122},[2208,2407,2408],{"id":2408},"server",[25,2410,2412],{"className":100,"code":2411,"language":102,"meta":30,"style":30},"type BookServer struct {\n\tpb.UnimplementedBookServiceServer\n}\n\nfunc (s *BookServer) Buy(ctx context.Context, req *pb.BookRequest) (*pb.BookResponse, error) {\n\tif req.Price == nil {\n\t\treturn &pb.BookResponse{Msg: \"price没传, 可能是无价之宝\"}, nil\n\t}\n\tmsg := fmt.Sprintf(\"%s这本书价格为:%d元\", req.Name, req.GetPrice().GetValue())\n\tif req.Author != nil {\n\t\tmsg += \",作者为:\" + req.GetAuthor()\n\t}\n\treturn &pb.BookResponse{Msg: msg}, nil\n}\n",[21,2413,2414,2427,2438,2442,2446,2514,2532,2561,2569,2620,2637,2661,2669,2694],{"__ignoreMap":30},[34,2415,2416,2418,2421,2423,2425],{"class":36,"data-line":37,"line":37},[34,2417,1585],{"class":40},[34,2419,2420],{"class":139}," BookServer",[34,2422,1591],{"class":40},[34,2424,119],{"class":50},[34,2426,210],{"class":122},[34,2428,2429,2431,2433,2435],{"class":36,"data-line":113,"line":113},[34,2430,130],{"class":129},[34,2432,1602],{"class":139},[34,2434,1605],{"class":50},[34,2436,2437],{"class":139},"UnimplementedBookServiceServer\n",[34,2439,2440],{"class":36,"data-line":126,"line":126},[34,2441,225],{"class":122},[34,2443,2444],{"class":36,"data-line":146,"line":146},[34,2445,156],{"emptyLinePlaceholder":155},[34,2447,2448,2450,2452,2454,2456,2458,2461,2463,2465,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512],{"class":36,"data-line":152,"line":152},[34,2449,1621],{"class":40},[34,2451,119],{"class":50},[34,2453,409],{"class":122},[34,2455,1629],{"class":1628},[34,2457,1632],{"class":40},[34,2459,2460],{"class":139},"BookServer",[34,2462,415],{"class":122},[34,2464,119],{"class":50},[34,2466,2467],{"class":139},"Buy",[34,2469,409],{"class":122},[34,2471,1647],{"class":1628},[34,2473,1650],{"class":139},[34,2475,1605],{"class":50},[34,2477,1655],{"class":139},[34,2479,1658],{"class":50},[34,2481,1661],{"class":1628},[34,2483,1664],{"class":40},[34,2485,1602],{"class":139},[34,2487,1605],{"class":50},[34,2489,2384],{"class":139},[34,2491,415],{"class":122},[34,2493,119],{"class":50},[34,2495,409],{"class":122},[34,2497,1632],{"class":40},[34,2499,1602],{"class":139},[34,2501,1605],{"class":50},[34,2503,2397],{"class":139},[34,2505,1658],{"class":50},[34,2507,1689],{"class":40},[34,2509,415],{"class":122},[34,2511,119],{"class":50},[34,2513,210],{"class":122},[34,2515,2516,2518,2520,2523,2526,2528,2530],{"class":36,"data-line":159,"line":159},[34,2517,130],{"class":129},[34,2519,1971],{"class":40},[34,2521,2522],{"class":50}," req.Price ",[34,2524,2525],{"class":40},"==",[34,2527,1980],{"class":85},[34,2529,119],{"class":50},[34,2531,210],{"class":408},[34,2533,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2555,2557,2559],{"class":36,"data-line":165,"line":165},[34,2535,130],{"class":129},[34,2537,130],{"class":129},[34,2539,1840],{"class":40},[34,2541,1843],{"class":40},[34,2543,1602],{"class":139},[34,2545,1605],{"class":50},[34,2547,2397],{"class":139},[34,2549,1729],{"class":1778},[34,2551,1930],{"class":50},[34,2553,2554],{"class":46},"\"price没传, 可能是无价之宝\"",[34,2556,1869],{"class":1778},[34,2558,1658],{"class":50},[34,2560,1874],{"class":85},[34,2562,2563,2565,2567],{"class":36,"data-line":174,"line":174},[34,2564,130],{"class":129},[34,2566,30],{"class":50},[34,2568,225],{"class":408},[34,2570,2571,2573,2576,2578,2581,2584,2586,2588,2590,2593,2596,2599,2602,2605,2607,2609,2611,2614,2616,2618],{"class":36,"data-line":185,"line":185},[34,2572,130],{"class":129},[34,2574,2575],{"class":50},"msg ",[34,2577,1705],{"class":40},[34,2579,2580],{"class":50}," fmt.",[34,2582,2583],{"class":139},"Sprintf",[34,2585,409],{"class":408},[34,2587,136],{"class":46},[34,2589,2028],{"class":85},[34,2591,2592],{"class":46},"这本书价格为:",[34,2594,2595],{"class":85},"%d",[34,2597,2598],{"class":46},"元\"",[34,2600,2601],{"class":50},", req.Name, req.",[34,2603,2604],{"class":139},"GetPrice",[34,2606,409],{"class":1778},[34,2608,415],{"class":1778},[34,2610,1605],{"class":50},[34,2612,2613],{"class":139},"GetValue",[34,2615,409],{"class":1778},[34,2617,415],{"class":1778},[34,2619,149],{"class":408},[34,2621,2622,2624,2626,2629,2631,2633,2635],{"class":36,"data-line":637,"line":637},[34,2623,130],{"class":129},[34,2625,1971],{"class":40},[34,2627,2628],{"class":50}," req.Author ",[34,2630,1977],{"class":40},[34,2632,1980],{"class":85},[34,2634,119],{"class":50},[34,2636,210],{"class":408},[34,2638,2639,2641,2643,2645,2647,2650,2652,2654,2657,2659],{"class":36,"data-line":654,"line":654},[34,2640,130],{"class":129},[34,2642,130],{"class":129},[34,2644,2575],{"class":50},[34,2646,1763],{"class":40},[34,2648,2649],{"class":46}," \",作者为:\"",[34,2651,1769],{"class":40},[34,2653,1772],{"class":50},[34,2655,2656],{"class":139},"GetAuthor",[34,2658,409],{"class":1778},[34,2660,149],{"class":1778},[34,2662,2663,2665,2667],{"class":36,"data-line":671,"line":671},[34,2664,130],{"class":129},[34,2666,30],{"class":50},[34,2668,225],{"class":408},[34,2670,2671,2673,2675,2677,2679,2681,2683,2685,2688,2690,2692],{"class":36,"data-line":688,"line":688},[34,2672,130],{"class":129},[34,2674,1840],{"class":40},[34,2676,1843],{"class":40},[34,2678,1602],{"class":139},[34,2680,1605],{"class":50},[34,2682,2397],{"class":139},[34,2684,1729],{"class":408},[34,2686,2687],{"class":50},"Msg: msg",[34,2689,1869],{"class":408},[34,2691,1658],{"class":50},[34,2693,1874],{"class":85},[34,2695,2696],{"class":36,"data-line":705,"line":705},[34,2697,225],{"class":122},[2208,2699,2700],{"id":2700},"client",[25,2702,2704],{"className":100,"code":2703,"language":102,"meta":30,"style":30},"\u002F\u002F book\nauthor := \"codepzj\"\nbookResp, err := bookClient.Buy(ctx, &pb.BookRequest{Name: \"《Go语言圣经》\", Price: &wrapperspb.Int32Value{Value: 99}, Author: &author})\nif err != nil {\n\tlog.Fatalf(\"failed to call Buy: %v\", err)\n}\nlog.Printf(\"Response: %s\", bookResp.Msg)\n\nbookResp, err = bookClient.Buy(ctx, &pb.BookRequest{Name: \"《如何让富婆爱上你》\"})\nif err != nil {\n\tlog.Fatalf(\"failed to call Buy: %v\", err)\n}\nlog.Printf(\"Response: %s\", bookResp.Msg)\n",[21,2705,2706,2711,2721,2788,2802,2823,2827,2846,2850,2883,2897,2917,2921],{"__ignoreMap":30},[34,2707,2708],{"class":36,"data-line":37,"line":37},[34,2709,2710],{"class":109},"\u002F\u002F book\n",[34,2712,2713,2716,2718],{"class":36,"data-line":113,"line":113},[34,2714,2715],{"class":50},"author ",[34,2717,1705],{"class":40},[34,2719,2720],{"class":46}," \"codepzj\"\n",[34,2722,2723,2726,2728,2731,2733,2735,2737,2739,2741,2743,2745,2747,2750,2753,2756,2758,2761,2763,2766,2768,2771,2774,2776,2779,2781,2784,2786],{"class":36,"data-line":126,"line":126},[34,2724,2725],{"class":50},"bookResp, err ",[34,2727,1705],{"class":40},[34,2729,2730],{"class":50}," bookClient.",[34,2732,2467],{"class":139},[34,2734,409],{"class":122},[34,2736,1916],{"class":50},[34,2738,1919],{"class":40},[34,2740,1602],{"class":139},[34,2742,1605],{"class":50},[34,2744,2384],{"class":139},[34,2746,1729],{"class":408},[34,2748,2749],{"class":50},"Name: ",[34,2751,2752],{"class":46},"\"《Go语言圣经》\"",[34,2754,2755],{"class":50},", Price: ",[34,2757,1919],{"class":40},[34,2759,2760],{"class":139},"wrapperspb",[34,2762,1605],{"class":50},[34,2764,2765],{"class":139},"Int32Value",[34,2767,1729],{"class":1778},[34,2769,2770],{"class":50},"Value: ",[34,2772,2773],{"class":85},"99",[34,2775,1869],{"class":1778},[34,2777,2778],{"class":50},", Author: ",[34,2780,1919],{"class":40},[34,2782,2783],{"class":50},"author",[34,2785,1869],{"class":408},[34,2787,149],{"class":122},[34,2789,2790,2792,2794,2796,2798,2800],{"class":36,"data-line":146,"line":146},[34,2791,1971],{"class":40},[34,2793,1974],{"class":50},[34,2795,1977],{"class":40},[34,2797,1980],{"class":85},[34,2799,119],{"class":50},[34,2801,210],{"class":122},[34,2803,2804,2806,2808,2810,2812,2815,2817,2819,2821],{"class":36,"data-line":152,"line":152},[34,2805,130],{"class":129},[34,2807,1991],{"class":50},[34,2809,1994],{"class":139},[34,2811,409],{"class":408},[34,2813,2814],{"class":46},"\"failed to call Buy: ",[34,2816,2002],{"class":85},[34,2818,136],{"class":46},[34,2820,2007],{"class":50},[34,2822,149],{"class":408},[34,2824,2825],{"class":36,"data-line":159,"line":159},[34,2826,225],{"class":122},[34,2828,2829,2831,2833,2835,2837,2839,2841,2844],{"class":36,"data-line":165,"line":165},[34,2830,1991],{"class":50},[34,2832,2020],{"class":139},[34,2834,409],{"class":122},[34,2836,2025],{"class":46},[34,2838,2028],{"class":85},[34,2840,136],{"class":46},[34,2842,2843],{"class":50},", bookResp.Msg",[34,2845,149],{"class":122},[34,2847,2848],{"class":36,"data-line":174,"line":174},[34,2849,156],{"emptyLinePlaceholder":155},[34,2851,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2879,2881],{"class":36,"data-line":185,"line":185},[34,2853,2725],{"class":50},[34,2855,89],{"class":40},[34,2857,2730],{"class":50},[34,2859,2467],{"class":139},[34,2861,409],{"class":122},[34,2863,1916],{"class":50},[34,2865,1919],{"class":40},[34,2867,1602],{"class":139},[34,2869,1605],{"class":50},[34,2871,2384],{"class":139},[34,2873,1729],{"class":408},[34,2875,2749],{"class":50},[34,2877,2878],{"class":46},"\"《如何让富婆爱上你》\"",[34,2880,1869],{"class":408},[34,2882,149],{"class":122},[34,2884,2885,2887,2889,2891,2893,2895],{"class":36,"data-line":637,"line":637},[34,2886,1971],{"class":40},[34,2888,1974],{"class":50},[34,2890,1977],{"class":40},[34,2892,1980],{"class":85},[34,2894,119],{"class":50},[34,2896,210],{"class":122},[34,2898,2899,2901,2903,2905,2907,2909,2911,2913,2915],{"class":36,"data-line":654,"line":654},[34,2900,130],{"class":129},[34,2902,1991],{"class":50},[34,2904,1994],{"class":139},[34,2906,409],{"class":408},[34,2908,2814],{"class":46},[34,2910,2002],{"class":85},[34,2912,136],{"class":46},[34,2914,2007],{"class":50},[34,2916,149],{"class":408},[34,2918,2919],{"class":36,"data-line":671,"line":671},[34,2920,225],{"class":122},[34,2922,2923,2925,2927,2929,2931,2933,2935,2937],{"class":36,"data-line":688,"line":688},[34,2924,1991],{"class":50},[34,2926,2020],{"class":139},[34,2928,409],{"class":122},[34,2930,2025],{"class":46},[34,2932,2028],{"class":85},[34,2934,136],{"class":46},[34,2936,2843],{"class":50},[34,2938,149],{"class":122},[2208,2940,2941],{"id":2941},"输出结果",[25,2943,2947],{"className":2944,"code":2945,"language":2946,"meta":30,"style":30},"language-bash shiki shiki-themes github-light github-dark","2025\u002F12\u002F12 00:33:26 Response: 《Go语言圣经》这本书价格为:99元,作者为:codepzj\n2025\u002F12\u002F12 00:33:26 Response: price没传, 可能是无价之宝\n","bash",[21,2948,2949,2963],{"__ignoreMap":30},[34,2950,2951,2954,2957,2960],{"class":36,"data-line":37,"line":37},[34,2952,2953],{"class":139},"2025\u002F12\u002F12",[34,2955,2956],{"class":46}," 00:33:26",[34,2958,2959],{"class":46}," Response:",[34,2961,2962],{"class":46}," 《Go语言圣经》这本书价格为:99元,作者为:codepzj\n",[34,2964,2965,2967,2969,2971,2974],{"class":36,"data-line":113,"line":113},[34,2966,2953],{"class":139},[34,2968,2956],{"class":46},[34,2970,2959],{"class":46},[34,2972,2973],{"class":46}," price没传,",[34,2975,2976],{"class":46}," 可能是无价之宝\n",[10,2978,2979],{},"本质上就是把字段拿出来判断指针是否为nil，如果为nil，说明字段没有赋值，不为nil，说明字段有值",[14,2981,2982],{"id":2982},"代码仓库",[10,2984,2985],{},"本教程都是一步步手敲出来的，对应的代码仓库链接为：",[10,2987,2988],{},[2989,2990,2991],"a",{"href":2991,"rel":2992},"https:\u002F\u002Fcnb.cool\u002Fcodepzj\u002Fgoplayground\u002F-\u002Ftree\u002Fmain\u002Frpc-learn\u002Fproto-learn",[2993],"nofollow",[10,2995,2996],{},"参考文章：",[362,2998,2999,3005],{},[365,3000,3001],{},[2989,3002,3003],{"href":3003,"rel":3004},"https:\u002F\u002Fwww.liwenzhou.com\u002Fposts\u002FGo\u002FProtobuf3-language-guide-zh\u002F",[2993],[365,3006,3007],{},[2989,3008,3009],{"href":3009,"rel":3010},"https:\u002F\u002Fwww.liwenzhou.com\u002Fposts\u002FGo\u002Foneof-wrappers-field_mask\u002F",[2993],[3012,3013,3014],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}",{"title":30,"searchDepth":146,"depth":146,"links":3016},[3017,3018,3019,3020,3021,3022,3023,3024,3025,3033],{"id":16,"depth":113,"text":16},{"id":54,"depth":113,"text":54},{"id":60,"depth":113,"text":60},{"id":190,"depth":113,"text":190},{"id":357,"depth":113,"text":357},{"id":553,"depth":113,"text":553},{"id":1239,"depth":113,"text":1239},{"id":1332,"depth":113,"text":1332},{"id":2162,"depth":113,"text":2163,"children":3026},[3027],{"id":2206,"depth":126,"text":553,"children":3028},[3029,3030,3031,3032],{"id":29,"depth":146,"text":29},{"id":2408,"depth":146,"text":2408},{"id":2700,"depth":146,"text":2700},{"id":2941,"depth":146,"text":2941},{"id":2982,"depth":113,"text":2982},[3035],"微服务","2025-12-09","系统介绍 Protocol Buffers 的消息、字段、枚举、服务、导入、oneof 和包装类型等核心语法。",false,"md",null,{"slots":3042},{},"\u002F2025\u002F12\u002Fproto-syntax",{"text":3045,"minutes":3046,"time":3047,"words":3048},"7 min read",6.685,401100,1337,{"title":5,"description":3037},{"loc":3043},"posts\u002F2025\u002F12\u002Fproto-syntax",[3053,3035],"gRPC","tech","2025-12-11","na0bFE9NugIK-reRgurVcnQ2LbD_M2JnnzHhoj3SRzI",[3058,3062],{"title":3059,"path":3060,"stem":3061,"date":3036,"type":3054,"children":-1},"gRPC 工作原理与通信流程","\u002F2025\u002F12\u002Fgrpc-internals","posts\u002F2025\u002F12\u002Fgrpc-internals",{"title":3063,"path":3064,"stem":3065,"date":3066,"type":3054,"children":-1},"gRPC 四种通信模式详解","\u002F2025\u002F12\u002Fgrpc-4method","posts\u002F2025\u002F12\u002Fgrpc-4method","2025-12-16",1786555054771]