• 关于

    .net调用windows api

    的搜索结果

问题

Java 使用 Jacob 调用 COM 接口大漠插件 dm.dll 报错?报错

JDK & JRE: Jacob Jar: Jacob dll: Main.java package org.csaarg.gui; import com.jacob....
爱吃鱼的程序员 2020-06-07 22:17:51 0 浏览量 回答数 1

问题

.NET核心实体框架让用户运行存储过程

我有一个正在Windows身份验证下运行的ASP.NET Core Web API。我有使用连接字符串语法处理数据库的实体框架: "data source=dbserver; initial catalog&#...
游客syccbxcrjoo2g 2019-12-01 22:07:08 16 浏览量 回答数 0

回答

首先的说明,非原生的程序,也就是脚本或者Java,.NET之类的都可以直接跨平台,前提是,有对应平台的运行时或者虚拟机,或者是Host,例如nodejs之类,JavaScript一般是运行在浏览器.而nodejs也就是一个JavaScript主机,类似与Microsoft的WSCript。所以只要有运行时什么的,打包很容易的。就从最简单的Shell脚本来说,在Windows上有Cygwin MSYS MSYS2移植了Bash,那么shell脚本就能够在Windows上运行,同样的在Linux上,如果有cmd以及对应命令的实现,那么Batch文件就能够在Linux中执行,但是,几乎没有多少人会将批处理移植到Linux,批处理本身来说,简单,还是简单。例如PowerShell,在Windows上非常强大,有些开发者期待能够在Linux Mac上运行,所以出现了一个Pash的开源项目,基于Mono框架。项目地址:http://pash.sourceforge.net/ Github:https://github.com/Pash-Project/Pash ,Shell脚本本质上的执行是主机解析然后执行的,这种的移植只要有解释器就行,也就是'host'。类似于Java,.NET语言,这种语言是编译型,但是生成的代码是一种虚拟机代码,JVM虚拟机,.NET虚拟机,执行的时候,虚拟机解释或者JIT,目前基本以JIT为主,这种移植的原理就得实现一个虚拟机,运行时,JIT能够把代码编译成对应的机器码。目前.NET Java都能实现跨平台。第三种,也就是wine之类的,这个最为复杂,例如Windows 目录下的system32目录下以来的dlls,wine都得实现,wine还得让这些dlls的后端能够调用Linux的API,借口等等,对于一个PE程序,wine还得实现PE程序(.exe)的加载,环境的初始化,还得虚拟出一个Windows NT的环境,wine目前已经能有不错的效果了。对于Windows,也有人基于Cygwin实现一个能够运行linux程序的host,目前没有最新消息。虚拟机不在本文讨论中。未完待续。
a123456678 2019-12-02 02:54:57 0 浏览量 回答数 0

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

回答

410 时区位置Web服务 Google Maps时区API 必应地图时区API Azure Maps时区API GeoNames时区API TimeZoneDB API AskGeo-商业(但可以说比GeoNames更准确) GeoGarage时区API-商业,主要针对航海时区。 原始时区边界数据 时区边界生成器 -从OpenStreetMaps地图数据生成时区shapefile。包括海岸线附近的领水。 以下项目以前是时区边界数据的来源,但不再得到积极维护。 tz_world-来自Eric Muller的原始shapefile数据 whereonearth-timezone-合并了WOEDB数据的GeoJSON版本 时区地理位置离线实现 使用时区边界生成器数据的实现 node-geo-tz -JavaScript库(仅Node.js) 时空-JavaScript库 tz-lookup -JavaScript库 GeoTimeZone-.NET库 地理时区 -PHP库 timezonefinder -Python库 ZoneDetect -C库 Timeshape -Java库 TimeZoneMap -Java和Android库 lutz -R库 Go-tz -Go库 时区查询 -Go库 使用较旧的tz_world数据的实现 latlong -Go库(另请阅读此帖子。) TimeZoneMapper -Java库 tzwhere -JavaScript /节点库 pytzwhere -Python库 timezone_finder -Ruby库 LatLongToTimeZone -Java和Swift库 现在几点了?-描述PHP和MongoDB的博客文章 Rundel /时区 -R库 调用其中一种Web服务的库 时区 -调用GeoNames的Ruby gem AskGeo有自己的库,可以从Java或.Net进行调用 GeoNames拥有几乎所有内容的客户端库 其他想法 使用R-Tree查找最近的城市 使用MySQL查找最近的城市 如果您知道其他任何人,请更新此列表 另外,请注意,最接近城市的方法可能不会产生“正确”的结果,只是一个近似值。 转换为Windows区域 列出的大多数方法将返回IANA时区ID。如果需要转换为Windows时区以便与TimeZoneInfo.NET中的类一起使用,请使用TimeZoneConverter库。 不要使用zone.tab 该时区信息数据库包括一个名为文件zone.tab。该文件主要用于提供时区列表供用户选择。它包括每个时区的参考点的纬度和经度坐标。这样可以创建突出显示这些点的地图。例如,请参见moment-timezone主页上显示的交互式地图。 尽管可能很想使用此数据从纬度和经度坐标解析时区,但请注意这些是点而不是边界。最好的办法是确定最接近的点,在许多情况下,这不是正确的点。
你的答案 2020-05-08 20:48:03 0 浏览量 回答数 0

问题

用日志服务API遇到问题

我在windows平台上用c++开发用到阿里云日志服务,由于没有相应的SDK,我用API处理,按照协议,数据protobuf序列化、LZ4压缩、数字签名等这些都已经处理...
游客y63g4mowaejte 2019-12-01 21:56:47 54 浏览量 回答数 0

回答

不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html###### 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? ######jnotify bug很多 我也遇到过,还有rename的问题 我现在改用了jpathwatch,稍微好点 总的来说java的watch service没一个好用的,连jdk7的我也测试了 我觉得这也和linux文件系统设计有缺陷有关###### 引用来自“浪客Dandy”的答案 jnotify bug很多 我也遇到过,还有rename的问题 我现在改用了jpathwatch,稍微好点 总的来说java的watch service没一个好用的,连jdk7的我也测试了 我觉得这也和linux文件系统设计有缺陷有关 jpathwatch我也试过一样,监控一个文件的修改也是执行三四次回调,你是怎么解决这个问题的啊 jpathwatch和jnotify都是基于事件驱动的啊,jdk7还没试过。我也试过线程轮寻,不过那个太费资源了啊,如果文件改动比较频繁的话,系统吃不消啊,没办法啊 你用jpathwatch怎么解决执行三四次回调问题的啊 ###### 引用来自“hld_hepeng”的答案 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? open有多个还是什么? 不行你就监控close_write就可以了吗. 请多程序都会这样操作.多次打开文件.不一定是系统的问题. ###### 引用来自“ZYud”的答案 引用来自“hld_hepeng”的答案 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? open有多个还是什么? 不行你就监控close_write就可以了吗. 请多程序都会这样操作.多次打开文件.不一定是系统的问题. 我监控的是修改事件啊,好像没有close_write的吧 只有四个回调方法fileRenamed,fileModified,fileDeleted,fileCreated fileCreated和fileDeleted回调时是只执行一次的,但如果一个文件有更改的话会执行多次fileModified回调,我想让这个回调只执行一次???? ######坦白的说我还没找到完美的解决方法,我现在在尝试调用inotifywait 然后解析命令行输出最为结果,还在尝试阶段###### 引用来自“浪客Dandy”的答案 坦白的说我还没找到完美的解决方法,我现在在尝试调用inotifywait 然后解析命令行输出最为结果,还在尝试阶段 那可怎么办啊,这个问题也困扰我很久了啊,怎么办呢?? ######只能做个延时处理.或者换种思路.你如果想当文件修改完成时做一些操作的话,不妨有close_write######java的inotify封装就没有带close write的,这主要是因为他们都想统一win mac linux的开发接口 我觉得至少对于linux而言 必须单独做 所以我在尝试inotify tools 说实话 在这方面windows api要强太多了
kun坤 2020-06-05 14:26:33 0 浏览量 回答数 0

回答

" 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html######<div class=""ref""> 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? ###### jnotify bug很多 我也遇到过,还有rename的问题 我现在改用了jpathwatch,稍微好点 总的来说java的watch service没一个好用的,连jdk7的我也测试了 我觉得这也和linux文件系统设计有缺陷有关###### 引用来自“浪客Dandy”的答案 jnotify bug很多 我也遇到过,还有rename的问题 我现在改用了jpathwatch,稍微好点 总的来说java的watch service没一个好用的,连jdk7的我也测试了 我觉得这也和linux文件系统设计有缺陷有关 jpathwatch我也试过一样,监控一个文件的修改也是执行三四次回调,你是怎么解决这个问题的啊 jpathwatch和jnotify都是基于事件驱动的啊,jdk7还没试过。我也试过线程轮寻,不过那个太费资源了啊,如果文件改动比较频繁的话,系统吃不消啊,没办法啊 你用jpathwatch怎么解决执行三四次回调问题的啊 ###### 引用来自“hld_hepeng”的答案 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? open有多个还是什么? 不行你就监控close_write就可以了吗. 请多程序都会这样操作.多次打开文件.不一定是系统的问题. ###### 引用来自“ZYud”的答案 引用来自“hld_hepeng”的答案 引用来自“ZYud”的答案 不是会自动通知你的回调吗? http://jnotify.sourceforge.net/sample.html 是执行回调了啊,但是一个文件执行了多次回调啊,这样我在回调里写的解析操作要执行多次啊,我想让回调就执行一次啊????? open有多个还是什么? 不行你就监控close_write就可以了吗. 请多程序都会这样操作.多次打开文件.不一定是系统的问题. 我监控的是修改事件啊,好像没有close_write的吧 只有四个回调方法fileRenamed,fileModified,fileDeleted,fileCreated fileCreated和fileDeleted回调时是只执行一次的,但如果一个文件有更改的话会执行多次fileModified回调,我想让这个回调只执行一次???? ###### 坦白的说我还没找到完美的解决方法,我现在在尝试调用inotifywait 然后解析命令行输出最为结果,还在尝试阶段###### 引用来自“浪客Dandy”的答案 坦白的说我还没找到完美的解决方法,我现在在尝试调用inotifywait 然后解析命令行输出最为结果,还在尝试阶段 那可怎么办啊,这个问题也困扰我很久了啊,怎么办呢?? ###### 只能做个延时处理.或者换种思路.你如果想当文件修改完成时做一些操作的话,不妨有close_write###### java的inotify封装就没有带close write的,这主要是因为他们都想统一win mac linux的开发接口 我觉得至少对于linux而言 必须单独做 所以我在尝试inotify tools 说实话 在这方面windows api要强太多了"
montos 2020-06-04 13:31:02 0 浏览量 回答数 0

回答

捕获不了的,只有用超时实现。jquery对跨域jsonp请求是没有做异常处理的。 ######你回调了callback,,这个callback可以写成一个包含闭包,或者是某个可见变量的函数,,,,然后在其他你要调用那块json的时候,通过判断前面进去的闭包或者其他变量值,,,来判断这个script的加载情况######能给个demo吗,js研究不是很深入.######仅供参考 —— http://blog.csdn.net/qingralf/article/details/8285048######windows.error 不是这个? ###### var JSONP = (function () { var counter = 0, head, query, key, window = this; function load(url) { var script = document.createElement('script'), var done = false; script.src = url; script.async = true; script.onload = script.onreadystatechange = function () { if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) { done = true; script.onload = script.onreadystatechange = null; if (script && script.parentNode) { script.parentNode.removeChild(script); } } }; if (!head) { head = document.getElementsByTagName('head')[0]; } head.appendChild(script); } function jsonp(url, params, error, callback) { query = "?"; params = params || {}; for (key in params) { if (params.hasOwnProperty(key)) { query += encodeURIComponent(key) + "=" + encodeURIComponent(params[key]) + "&"; } } var jsonp = "json" + (++counter); window[jsonp] = function (data) { callback(data); try { delete window[jsonp]; } catch (e) {} window[jsonp] = null; }; load(url + query + "callback=" + jsonp); error = error || function () {}; window.setTimeout(function () { if (typeof window[jsonp] == "function") { // replace success with null callback in case the request is just very latent. window[jsonp] = function (data) { try { delete window[jsonp]; } catch (e) {} window[jsonp] = null; }; // call the error callback error(); // set a longer timeout to safely clean up the unused callback. window.setTimeout(function () { if (typeof window[jsonp] == "function") { try { delete window[jsonp]; } catch (e) {} window[jsonp] = null; }; }, 120000); }; }, 10000); return jsonp; } return { get: jsonp }; }()); /* Example: ---------------- var url = 'http://blog.eood.cn/api'; var error = function() {alert('error');}; var success = function(data) { // process the data }; JSONP.get( url, {'parm1': 'parm1_value', 'parm2': 'parm2_value'}, error, success); */ 找到一个JSONP的封装,原理还是利用超时,结贴! ###### $.ajaxSetup( { error: function(jqXHR, textStatus, errorMsg){ // 出错时默认的处理函数 // jqXHR 是经过jQuery封装的XMLHttpRequest对象 // textStatus 可能为: null、"timeout"、"error"、"abort"或"parsererror" // errorMsg 可能为: "Not Found"、"Internal Server Error"等 // 提示形如:发送AJAX请求到"/index.html"时出错[404]:Not Found alert( '发送AJAX请求到"' + this.url + '"时出错[' + jqXHR.status + ']:' + errorMsg ); } } );
爱吃鱼的程序员 2020-06-04 17:10:58 0 浏览量 回答数 0

回答

I am sorry,忘了贴这个方法了。 /***************************************************************************** * 获得段落中字符串的值 * @param obj 某个段落 * @return String 段落中文字 *****************************************************************************/ public static String getParagraphStrValue(Object obj){ if(obj == null){return null;} StringBuffer sb = new StringBuffer(256); if (obj instanceof ContentAccessor){ List<Object> texts = getAllElementFromObject(obj, Text.class); for (Object child : texts) { sb.append(((Text)child).getValue()); } }else if(obj instanceof JAXBElement){ sb.append(((Text)obj).getValue()); } return sb.toString(); } ######回复 @anyine : 不客气,恰好我做过这方面的工作,拿出来分享。######ok ,我先试试,太感谢了!######你的word是2003格式还是2007格式? 对于2007格式的word,遵循Ecma Office Open XML协议规范, 我现在用的是docx4j, 我在word模版中放的是如下json串,通过解析json串来替换 {"cat":"img","alias":"img1"} 如下是我替换将word中文字替换成图片的方法: /***************************************************************************** * 替换图表 * @param obj 需要替换的paragraph * @param imgPath 图片路径 * @param wordMLPackage wordMLPackage *****************************************************************************/ public static void replaceChart(Object obj,String imgPath,WordprocessingMLPackage wordMLPackage){ if(obj == null || imgPath == null){return;} List<Object> texts = getAllElementFromObject(obj, Text.class); for (Object t : texts) { Text content = (Text) t; content.setValue(""); } File file = new File(imgPath); InputStream is = null; try { is = new FileInputStream(file ); long length = file.length(); if (length > Integer.MAX_VALUE) { return; } byte[] bytes = new byte[(int)length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { return; } String filenameHint = null; String altText = null; int id1 = 0; int id2 = 1; newImage(wordMLPackage, (P)obj, bytes, filenameHint, altText, id1, id2); } catch (Exception e) { //e.printStackTrace(); }finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } //添加图片     private static  void newImage( WordprocessingMLPackage wordMLPackage,P p,byte[] bytes,String filenameHint, String altText,             int id1, int id2) throws Exception {         BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);         Inline inline = imagePart.createImageInline( filenameHint, altText,id1, id2, false);         // Now add the inline in w:p/w:r/w:drawing         ObjectFactory factory = Context.getWmlObjectFactory();         R run = factory.createR();             p.getContent().add(run);         PPr ppr = factory.createPPr();         Jc jc = factory.createJc();         Ind ind = factory.createPPrBaseInd();         ind.setFirstLine(new BigInteger("0"));         ind.setFirstLineChars(new BigInteger("0"));         jc.setVal(JcEnumeration.LEFT);         ppr.setJc(jc);         ppr.setInd(ind);         p.setPPr(ppr);         Drawing drawing = factory.createDrawing();             run.getContent().add(drawing);             drawing.getAnchorOrInline().add(inline);     } ######回复 @bigtiger02 : 恩,这是个麻烦事儿,用你说的第一种办法可行吗?######回复 @anyine : jacob是一个java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库,只能在windows环境下使用######回复 @bigtiger02 : 我的web运行在linux下 jacob还有效吗######回复 @bigtiger02 : 3Q 我先看看...######回复 @anyine : 2003的话,我以前用的是jacob来进行替换,但是觉得并不是那么好用,给个jacob例子: http://blog.csdn.net/lulongzhou_llz/article/details/6701918###### 引用来自“bigtiger02”的答案 你的word是2003格式还是2007格式? 对于2007格式的word,遵循Ecma Office Open XML协议规范, 我现在用的是docx4j, 我在word模版中放的是如下json串,通过解析json串来替换 {"cat":"img","alias":"img1"} 如下是我替换将word中文字替换成图片的方法: /***************************************************************************** * 替换图表 * @param obj 需要替换的paragraph * @param imgPath 图片路径 * @param wordMLPackage wordMLPackage *****************************************************************************/ public static void replaceChart(Object obj,String imgPath,WordprocessingMLPackage wordMLPackage){ if(obj == null || imgPath == null){return;} List<Object> texts = getAllElementFromObject(obj, Text.class); for (Object t : texts) { Text content = (Text) t; content.setValue(""); } File file = new File(imgPath); InputStream is = null; try { is = new FileInputStream(file ); long length = file.length(); if (length > Integer.MAX_VALUE) { return; } byte[] bytes = new byte[(int)length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { return; } String filenameHint = null; String altText = null; int id1 = 0; int id2 = 1; newImage(wordMLPackage, (P)obj, bytes, filenameHint, altText, id1, id2); } catch (Exception e) { //e.printStackTrace(); }finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } //添加图片     private static  void newImage( WordprocessingMLPackage wordMLPackage,P p,byte[] bytes,String filenameHint, String altText,             int id1, int id2) throws Exception {         BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);         Inline inline = imagePart.createImageInline( filenameHint, altText,id1, id2, false);         // Now add the inline in w:p/w:r/w:drawing         ObjectFactory factory = Context.getWmlObjectFactory();         R run = factory.createR();             p.getContent().add(run);         PPr ppr = factory.createPPr();         Jc jc = factory.createJc();         Ind ind = factory.createPPrBaseInd();         ind.setFirstLine(new BigInteger("0"));         ind.setFirstLineChars(new BigInteger("0"));         jc.setVal(JcEnumeration.LEFT);         ppr.setJc(jc);         ppr.setInd(ind);         p.setPPr(ppr);         Drawing drawing = factory.createDrawing();             run.getContent().add(drawing);             drawing.getAnchorOrInline().add(inline);     } 回复 @bigtiger02 : 我现在能读取,能写入了。但是不知道用哪个方法指定写入的位置或者替换。 private static void addImageToPackage(WordprocessingMLPackage wordMLPackage,                             byte[] bytes) throws Exception {         BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);         int docPrId = 1;         int cNvPrId = 2;         Inline inline = imagePart.createImageInline("Filename hint","Alternative text", docPrId, cNvPrId, false);         P paragraph = addInlineImageToParagraph(inline);         wordMLPackage.getMainDocumentPart().addObject(paragraph);     }       /**      *  创建一个对象工厂并用它创建一个段落和一个可运行块R.      *  然后将可运行块添加到段落中. 接下来创建一个图画并将其添加到可运行块R中. 最后我们将内联      *  对象添加到图画中并返回段落对象.      *      * @param   inline 包含图片的内联对象.      * @return  包含图片的段落      */     private static P addInlineImageToParagraph(Inline inline) {         // 添加内联对象到一个段落中         ObjectFactory factory = new ObjectFactory();         P paragraph = factory.createP();         R run = factory.createR();         paragraph.getContent().add(run);         Drawing drawing = factory.createDrawing();         run.getContent().add(drawing);         drawing.getAnchorOrInline().add(inline);         return paragraph;     } 麻烦你指点一下呢 ######之前做excel的时候发现,图片就是用图片的二进制流做base64编码得到的字符串,word估计是一样的,你可以试试看######这个确实是,找到位置很关键###### 你可以用一段文字进行标记,然后查找将这段文字替换成图片即可。 world操作方法: //拷贝文件 dstUrlTmp = copyFile(modelUrl,dstUrl); //开始wordMLPackage = DocxUtils.load(dstUrlTmp); document = wordMLPackage.getMainDocumentPart(); //替换字符串、表格以及图片 replace(DocxUtils.getAllElementFromObject(document,P.class)); //保存 DocxUtils.save(wordMLPackage, dstUrl); replace方法: //执行替换 private void replace(List<Object> paragraphs){ final int pSize = paragraphs.size(); for (int i = 0; i < pSize; i++) { Object obj = paragraphs.get(i); String text = DocxUtils.getParagraphStrValue(obj); Set<String> jsons = getMatchStr("\\{(\"\\w+\":\"?\\w+\"?,*){1,}\\}", StringUtil.replace(text, CN_CHARS, CN_REPLACE_CHARS)); if(CollectionUtils.isNotEmpty(jsons)){//不为空则进行分发 for (String s : jsons) { DOCJsonObject jsonObject = null; try { jsonObject = new Gson().fromJson(s, DOCJsonObject.class); } catch (Exception e) { e.printStackTrace(); } if(jsonObject == null){ continue; }else{ DocxUtils.replaceChart(obj, imgPath, wordMLPackage); } } } } } 替换方法见一楼 getAllElementFromObject方法: /***************************************************************************** * 查找JAXBElement元素 * @param obj 查找目标 * @param toSearch 查找类的class * @return List<Object> *****************************************************************************/ public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) { List<Object> result = new ArrayList<Object>(); if (obj instanceof JAXBElement){ obj = ((JAXBElement<?>) obj).getValue(); } if (obj.getClass().equals(toSearch)){ result.add(obj); }else if (obj instanceof ContentAccessor) { List<?> children = ((ContentAccessor) obj).getContent(); for (Object child : children) { result.addAll(getAllElementFromObject(child, toSearch)); } } return result; } ###### 引用来自“bigtiger02”的答案 你可以用一段文字进行标记,然后查找将这段文字替换成图片即可。 world操作方法: //拷贝文件 dstUrlTmp = copyFile(modelUrl,dstUrl); //开始wordMLPackage = DocxUtils.load(dstUrlTmp); document = wordMLPackage.getMainDocumentPart(); //替换字符串、表格以及图片 replace(DocxUtils.getAllElementFromObject(document,P.class)); //保存 DocxUtils.save(wordMLPackage, dstUrl); replace方法: //执行替换 private void replace(List<Object> paragraphs){ final int pSize = paragraphs.size(); for (int i = 0; i < pSize; i++) { Object obj = paragraphs.get(i); String text = DocxUtils.getParagraphStrValue(obj); Set<String> jsons = getMatchStr("\\{(\"\\w+\":\"?\\w+\"?,*){1,}\\}", StringUtil.replace(text, CN_CHARS, CN_REPLACE_CHARS)); if(CollectionUtils.isNotEmpty(jsons)){//不为空则进行分发 for (String s : jsons) { DOCJsonObject jsonObject = null; try { jsonObject = new Gson().fromJson(s, DOCJsonObject.class); } catch (Exception e) { e.printStackTrace(); } if(jsonObject == null){ continue; }else{ DocxUtils.replaceChart(obj, imgPath, wordMLPackage); } } } } } 替换方法见一楼 getAllElementFromObject方法: /***************************************************************************** * 查找JAXBElement元素 * @param obj 查找目标 * @param toSearch 查找类的class * @return List<Object> *****************************************************************************/ public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) { List<Object> result = new ArrayList<Object>(); if (obj instanceof JAXBElement){ obj = ((JAXBElement<?>) obj).getValue(); } if (obj.getClass().equals(toSearch)){ result.add(obj); }else if (obj instanceof ContentAccessor) { List<?> children = ((ContentAccessor) obj).getContent(); for (Object child : children) { result.addAll(getAllElementFromObject(child, toSearch)); } } return result; } 我就想知道,我怎么通过我文档里的一段标示位找到一个对象来替换 P paragraph = 这里我想找到我要替换的东西; wordMLPackage.getMainDocumentPart().addObject(paragraph);   ###### 引用来自“anyine”的答案 引用来自“bigtiger02”的答案 你可以用一段文字进行标记,然后查找将这段文字替换成图片即可。 world操作方法: //拷贝文件 dstUrlTmp = copyFile(modelUrl,dstUrl); //开始wordMLPackage = DocxUtils.load(dstUrlTmp); document = wordMLPackage.getMainDocumentPart(); //替换字符串、表格以及图片 replace(DocxUtils.getAllElementFromObject(document,P.class)); //保存 DocxUtils.save(wordMLPackage, dstUrl); replace方法: //执行替换 private void replace(List<Object> paragraphs){ final int pSize = paragraphs.size(); for (int i = 0; i < pSize; i++) { Object obj = paragraphs.get(i); String text = DocxUtils.getParagraphStrValue(obj); Set<String> jsons = getMatchStr("\\{(\"\\w+\":\"?\\w+\"?,*){1,}\\}", StringUtil.replace(text, CN_CHARS, CN_REPLACE_CHARS)); if(CollectionUtils.isNotEmpty(jsons)){//不为空则进行分发 for (String s : jsons) { DOCJsonObject jsonObject = null; try { jsonObject = new Gson().fromJson(s, DOCJsonObject.class); } catch (Exception e) { e.printStackTrace(); } if(jsonObject == null){ continue; }else{ DocxUtils.replaceChart(obj, imgPath, wordMLPackage); } } } } } 替换方法见一楼 getAllElementFromObject方法: /***************************************************************************** * 查找JAXBElement元素 * @param obj 查找目标 * @param toSearch 查找类的class * @return List<Object> *****************************************************************************/ public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) { List<Object> result = new ArrayList<Object>(); if (obj instanceof JAXBElement){ obj = ((JAXBElement<?>) obj).getValue(); } if (obj.getClass().equals(toSearch)){ result.add(obj); }else if (obj instanceof ContentAccessor) { List<?> children = ((ContentAccessor) obj).getContent(); for (Object child : children) { result.addAll(getAllElementFromObject(child, toSearch)); } } return result; } 我就想知道,我怎么通过我文档里的一段标示位找到一个对象来替换 P paragraph = 这里我想找到我要替换的东西; wordMLPackage.getMainDocumentPart().addObject(paragraph);   我之前的是新添加了一个段落来写入图片 现在我想用文档里面现有的地方来写入图片 private static P addInlineImageToParagraph(Inline inline) { // 添加内联对象到一个段落中 ObjectFactory factory = new ObjectFactory(); P paragraph = factory.createP(); R run = factory.createR(); paragraph.getContent().add(run); Drawing drawing = factory.createDrawing(); run.getContent().add(drawing); drawing.getAnchorOrInline().add(inline); return paragraph; }   ######可以的,你可以写一个word模版,在需要替换的地方用string标记,比如标记成image,然后用 DocxUtils.getAllElementFromObject(document,P.class) 可以读取word里面所有的段落,用 DocxUtils.getParagraphStrValue(obj); 可以读取这个段落的字符串,若这个段落的字符串equals("image"),则进行替换 DocxUtils.replaceChart(obj, imgPath, wordMLPackage);###### 引用来自“bigtiger02”的答案 可以的,你可以写一个word模版,在需要替换的地方用string标记,比如标记成image,然后用 DocxUtils.getAllElementFromObject(document,P.class) 可以读取word里面所有的段落,用 DocxUtils.getParagraphStrValue(obj); 可以读取这个段落的字符串,若这个段落的字符串equals("image"),则进行替换 DocxUtils.replaceChart(obj, imgPath, wordMLPackage); DocxUtils.getParagraphStrValue 说了半天我就是不知道你这儿是怎么写的啊,查他的API不知道从哪儿查起 ######搞定..感谢
kun坤 2020-06-07 21:55:28 0 浏览量 回答数 0

问题

模拟登录163邮箱

项目要求:采用HTTP模拟系统自动登录到163邮箱,取对应主题下的邮件,打开邮件获取邮件内容 模拟登录,首先就是抓包,分析通讯数据包,并构造相应的数据包 ...
游客bnlxddh3fwntw 2020-04-25 14:23:37 14 浏览量 回答数 1

问题

osscmd-使用示例

安装配置osscmd 在Linux或者Windows上下载SDK安装包后,解压缩后就可以使用 osscmd了。 使用时直接调用python osscmd即可获取相应的说明。每种命令有两种执行模式。以查询用户所创建的buck...
青衫无名 2019-12-01 21:59:15 2553 浏览量 回答数 0

问题

云监控监控数据上报

您可以使用API或SDK上报监控数据。 注意事项 SDK支持python(2.6 +)与bash SDK上报数据 参数说明 userid,是用户的账号ID。监控项名称:...
反向一觉 2019-12-01 21:25:18 1392 浏览量 回答数 0

问题

借助Wireshark帮助定位调用阿里云OSS开发过程问题

云存储时代已经来临,程序员向云端转型是必需的一步。很多程序员同学在论坛中也抱怨OSS用不起来,我看了很多问题,都是一些基本的问题,比如endpoint域名填写不正确、bucket填写错...
云语科技 2019-12-01 21:47:48 11257 浏览量 回答数 6

回答

我们在《深入分析Java的编译原理》中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。 有了字节码,无论是哪种平台(如Windows、Linux等),只要安装了虚拟机,都可以直接运行字节码。 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合。这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Kotlin、Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。 经常使用IDE的开发者可能会发现,当我们在Intelij IDEA中,鼠标右键想要创建Java类的时候,IDE还会提示创建其他类型的文件,这就是IDE默认支持的一些可以运行在JVM上面的语言,没有提示的,可以通过插件来支持。 目前,可以直接在JVM上运行的语言有很多,今天介绍其中比较重要的九种。每种语言通过一段『HelloWorld』代码进行演示,看看不同语言的语法有何不同。 Kotlin Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。Kotlin的设计初衷就是用来生产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。 Hello World In Kotlin fun main(args: Array<String>) { println("Hello, world!") } Groovy Apache的Groovy是Java平台上设计的面向对象编程语言。它的语法风格与Java很像,Java程序员能够很快的熟练使用 Groovy,实际上,Groovy编译器是可以接受完全纯粹的Java语法格式的。 使用Groovy的一个重要特点就是使用类型推断,即能够让编译器能够在程序员没有明确说明的时候推断出变量的类型。Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也匹配Groovy的语法规则,尽管可能语义不同。 Hello World In Groovy static void main(String[] args) { println('Hello, world!'); } Scala Scala是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala经常被我们描述为多模式的编程语言,因为它混合了来自很多编程语言的元素的特征。但无论如何它本质上还是一个纯粹的面向对象语言。它相比传统编 程语言最大的优势就是提供了很好并行编程基础框架措施了。Scala代码能很好的被优化成字节码,运行起来和原生Java一样快。 Hello World In Scala object HelloWorld { def main(args: Array[String]) { System.out.println("Hello, world!"); } } Jruby JRuby是用来桥接Java与Ruby的,它是使用比Groovy更加简短的语法来编写代码,能够让每行代码执行更多的任务。就和Ruby一样,JRuby不仅仅只提供了高级的语法格式。它同样提供了纯粹的面向对象的实现,闭包等等,而且JRuby跟Ruby自身相比多了很多基于Java类库 可以调用,虽然Ruby也有很多类库,但是在数量以及广泛性上是无法跟Java标准类库相比的。 Hello World In Jruby puts 'Hello, world!' Jython Jython,是一个用Java语言写的Python解释器。Jython能够用Python语言来高效生成动态编译的Java字节码。 Hello World In Jython print "Hello, world!" Fantom Fantom是一种通用的面向对象编程语言,由Brian和Andy Frank创建,运行在Java Runtime Environment,JavaScript和.NET Common Language Runtime上。其主要设计目标是提供标准库API,以抽象出代码是否最终将在JRE或CLR上运行的问题。 Fantom是与Groovy以及JRuby差不多的一样面向对 象的编程语言,但是悲剧的是Fantom无法使用Java类库,而是使用它自己扩展的类库。 Hello World In Fantom class Hello { static Void main() { echo("Hello, world!") } } Clojure Clojure是Lisp编程语言在Java平台上的现代、函数式及动态方言。 与其他Lisp一样,Clojure视代码为数据且拥有一套Lisp宏系统。 虽然Clojure也能被直接编译成Java字节码,但是无法使用动态语言特性以及直 接调用Java类库。与其他的JVM脚本语言不一样,Clojure并不算是面向对象的。 Hello World In Clojure (defn -main [& args] (println "Hello, World!")) Rhino Rhino是一个完全以Java编写的JavaScript引擎,目前由Mozilla基金会所管理。 Rhino的特点是为JavaScript加了个壳,然后嵌入到Java中,这样能够让Java程序员直接使用。其中Rhino的JavaAdapters能够让JavaScript通过调用Java的类来实现特定的功能。 Hello World In Rhino print('Hello, world!') Ceylon Ceylon是一种面向对象,强烈静态类型的编程语言,强调不变性,由Red Hat创建。 Ceylon程序在Java虚拟机上运行,​​可以编译为JavaScript。 语言设计侧重于源代码可读性,可预测性,可扩展性,模块性和元编程性。 Hello World In Ceylon shared void run() { print("Hello, world!"); } 总结 好啦,以上就是目前主流的可以在JVM上面运行的9种语言。加上Java正好10种。如果你是一个Java开发,那么有必要掌握以上9中的一种,这样可以在一些有特殊需求的场景中有更多的选择。推荐在Groovy、Scala、Kotlin中选一个。
montos 2020-06-01 17:04:25 0 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。
有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板