全球批評升溫 日本將收緊燃煤發電設備出口條件

摘錄自2020年2月25日中央社報導

日本環境大臣小泉進次郎(Shinjiro Koizumi)今(25日)表示,日本收緊出口燃煤發電設備條件的審查報告將在6月底前發布。

路透社報導,在日本政府支持印尼、越南興建燃煤發電廠及日本蓋新的燃煤發電廠,引起全球批評後,小泉進次郎做上述宣布。小泉進次郎在記者會上表示,這項討論將為日本於12月籌劃的新基礎設施出口政策勾勒輪廓。

在現行政策下,當有國家或如果有國家需要選擇以燃煤作為發電來源,並向日本請求提供高效能的燃煤發電技術時,日本將會支持。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

預防全球災難 末日種子庫收6萬新種子樣本

摘錄自2020年2月25日中央社報導

挪威北極圈內的「末日種子庫」今(25日)預計將收到來自世界各地的6萬個種子樣本。這個全球最大農作物儲藏庫為了保護作物免於全球性災難,而囤積各類種子。

這些種子將寄存在挪威斯瓦巴群島(Svalbard)內斯匹次柏根島(Spitsbergen Island)朗葉比(Longyearbyen)附近的深山中,距離北極點(North Pole)約1000公里。

法新社報導,掌管種子庫的作物信託基金(Crop Trust)執行長施密茲(Stefan Schmitz)說:「隨著氣候變遷和生物多樣性喪失的速度增加,針對瀕臨滅絕作物的拯救工作產生新的急迫性。」

最新運送的一批將讓種子庫藏提升至約105萬種,這些種子放置在種子庫的三座地窖,這個種子庫被譽為糧食作物的「諾亞方舟」。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?

氣候風險應納入企業稽核 全球會計師公會聯盟發起倡議

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

HNU_團隊項目_數據庫框架Mybatis_環境配置和樣例,IDEA項目搭建四——使用Mybatis實現Dao層

前言

數據庫從最傳統的JDBC連接方式和數據庫池化技術Hibernate的使用,再到Mybatis的快捷輕量級操作,技術迭代的速度飛快。

在了解了基礎的理論和方法后,學習前沿編程框架、工具,我認為是一種必然的趨勢。

再不看看外面,可能真的要落伍了~

之後,我借團隊項目開發的機會,學習了Mybatis框架,和大家分享一下經驗,願意和大家共同進步!

 

正文

從零開始

參考: 

1. 下載Mybatis的,並且導入

  點擊連接,選擇下載Mybatis的jar包。這裡有三個文件,基礎使用的話,下載第一個mybatis-3.5.3.zip即可,如果需要查看源碼的話,建議將Source code也下載下來,Windows使用zip,Ubuntu使用tar.gz;

  Eclipse導入只要build puth即可,IDEA的話,在File->Project Structure里導入jar;(建議在項目內建一個lib文件夾,便於遷移)

  只是數據庫部分的話,以下兩個包便足夠了。

 

 

2. 新建Java Web Application,編寫數據庫配置文件

文件名可以自定義,我設置的是Mybatis.xml。但是要放到src的根目錄下,這一點要注意。

注意

url的配置信息中 ” & ” 符號無法解析,需要變為 “ & “;

映射文件路徑以 “ / ”作為文件夾,從src作為根目錄進行訪問;

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!--上面一段是非常重要的,有了這一段,xml的配置就擁有了自動補全,這也是考量Mybatis包是否導入成功的一個方面;-->
 6 <configuration>
 7 <!--    可以兼容多種數據庫,配置多個environment,default為當前配置-->
 8     <environments default="mysql">
 9         <environment id="mysql">
10             <transactionManager type="JDBC"/>
11 <!--            使用數據庫池化技術,詳細可以看官方文檔-->
12             <dataSource type="POOLED">
13                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
14                 <property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"/>
15                 <property name="username" value=username"/>
16                 <property name="password" value="password"/>
17             </dataSource>
18         </environment>
19     </environments>
20 <!--    映射文件路徑,需要告訴數據庫,要執行哪些操作,以及數據庫實體類和字段的對應關係,接下來進行解釋-->
21     <mappers>
22         <mapper resource="main/mapper/UserMapper.xml"/>
23     </mappers>
24 </configuration>

 

3. 編寫執行SQL語句的SqlSessionFactory

  可以編寫工具類或者工廠類,避免代碼重複。我這裏設置的是DBTools.java

 1 package main.dao;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import javax.annotation.Resource;
 9 import java.io.IOException;
10 import java.io.InputStream;
11 
12 /*
13 Comet_Fei
14 2019/11/17
15 */
16 public class DBTools
17 {
18     private static SqlSessionFactory sqlSessionFactory;
19 
20     static
21     {
22         try
23         {
24             //輸入流讀取文件 Resources Mybatis的自帶加載類
25             InputStream config = Resources.getResourceAsStream("mybatis.xml");
26             //工廠設計模式
27             sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
28         }
29         catch (IOException e)
30         {
31             e.printStackTrace();
32         }
33     }
34 
35     //創建可以執行映射文件sql的sqlsession
36     public static SqlSession getSqlSession()
37     {
38         return sqlSessionFactory.openSession();
39     }
40 }

 

4. 編寫表對應的實體類User.java

 此處可用IDEA的pojo快捷操作,生成對應實體;

package main.pojo;


public class User {

    private String userPhoneNumber;private String userName;private String userPassword;public User(String userPhoneNumber, String userName, String userPassword) {
        this.userPhoneNumber = userPhoneNumber;
        this.userName = userName;
        this.userPassword = userPassword;
    }

    public String getUserPhoneNumber() {
        return userPhoneNumber;
    }

    public void setUserPhoneNumber(String userPhoneNumber) {
        this.userPhoneNumber = userPhoneNumber;
    }public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    @Override
    public String toString() {
        return "User{" +
                "userPhoneNumber='" + userPhoneNumber + '\'' +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                '}';
    }
}

 

 

5. 編寫實體管理類映射接口UserMapper.java

  UserMapper接口和Mybatis的映射xml文件相對應,便於操作和使用

 

 1 package main.mapper;
 2 
 3 import main.pojo.User;
 4 
 5 import java.util.List;
 6 
 7 /*
 8 Comet_Fei
 9 2019/11/17
10 */
11 public interface UserMapper
12 {
13     int addUser(User user);
14     User getUser(String userPhoneNumber);
15     int deleteUser(String userPhoneNumber);
16     int setPassword(User user);
17     List<User> listUser();
18 
19 }

 

5. 編寫映射文件UserMapper.xml

  這類文件非常重要,會將數據庫表和Java代碼的pojo(bean)進行映射,極大的簡化了操作步驟,減小代碼量。

參數說明:

  • resultMap是數據庫表和實體的Map映射設置,在使用時,只要加入 resultMap=”userResultMap” 參數即可,如select語句;
  • parameterType是傳入的參數類型,如果傳入參數較多的話,可以使用實體類傳參,但是要寫明實體類全路徑;(還沒有學習複雜語句,所以這裏只是簡單介紹)
  • resultType是返回值類型,但是不能和resultMap同時存在;
  • 傳參方式如代碼所示,用  ${ } 標識參數,和接口一致;
  • namespace是全路徑,訪問到當前對應Map的接口文件;
  • 注意傳參的數據類型,如果是字符型或者String,需要用單引號包含,如: ‘${userName}’ 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="main.mapper.UserMapper">
    <resultMap id="userResultMap" type="main.pojo.User">
        <result property="userPhoneNumber" column="user_phone_number"/>
        <result property="headPictureId" column="head_pictureId"/>
        <result property="rolePowerId" column="role_power_id"/>
        <result property="userName" column="user_name"/>
        <result property="userPersonalAutograph" column="user_personal_autograph"/>
        <result property="userPassword" column="user_password"/>
        <result property="userSex" column="user_sex"/>
        <result property="userEmail" column="user_email"/>
        <result property="userAddress" column="user_address"/>
        <result property="userUploadNumbers" column="user_upload_numbers"/>
    </resultMap>

    <!--    添加用戶-->
    <insert id="addUser" parameterType="main.pojo.User">
        INSERT INTO user(user_phone_number, user_name, user_password)
        VALUES ('${userPhoneNumber}', '${userName}', '${userPassword}');
    </insert>
    <!--    刪除用戶-->
    <delete id="deleteUser" parameterType="String">
        DELETE FROM user WHERE user_phone_number = '${userPhoneNumber}';
    </delete>

    <!--    獲得賬號為user_phone_number的用戶-->
    <select id="getUser" resultMap="userResultMap">
        SELECT * FROM user WHERE user_phone_number = '${userPhoneNumber}';
    </select>

    <!--    獲得用戶列表-->
    <select id="listUser" resultType="main.pojo.User">
        SELECT * FROM user;
    </select>

    <!--    找回密碼-->
    <update id="setPassword" parameterType="main.pojo.User">
        UPDATE user SET user_password = ${userPassword} WHERE user_phone_number = '${userPhoneNumber}';
    </update>

</mapper>

 

 

6. 最後是操作層(DAO)UserDao.java

  因為操作層有特定的業務,這裏只是一個示意而已。java裏面的main函數可以進行局部測試,便於和前端、控制器(servlet)等對接。

 1 package main.dao;
 2 
 3 import main.mapper.UserMapper;
 4 import main.pojo.User;
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import java.io.IOException;
 8 
 9 /*
10 Comet_Fei
11 2019/11/17
12 */
13 public class UserDao {
14 //    定義dao內的sqlSession和映射接口mapper
15     private SqlSession sqlSession;
16     private UserMapper mapper;
17 
18     public UserDao()
19     {
20 //        通過工廠,初始化session;通過特有getMapper設置映射接口
21         sqlSession = DBTools.getSqlSession();
22         mapper = sqlSession.getMapper(UserMapper.class);
23     }
24 
25     //添加用戶 成功1 失敗0
26     public int addUser(String userPhoneNumber, String userPassword) throws IOException
27     {
28         //用戶的 手機號,姓名(默認手機號),密碼
29         User user = new User(userPhoneNumber,userPhoneNumber, userPassword);
30         int result = mapper.addUser(user);
31         sqlSession.commit();
32         System.out.println(result);
33         return result;
34     }
35 
36     //用戶登錄 短信 成功2;失敗0
37     public int right(String userPhoneNumber)
38     {
39         int result;
40         User user = mapper.getUser(userPhoneNumber);
41         if(user != null)
42         {
43             result = 2;//登錄成功
44         }
45         else
46         {
47             result = 0;//登錄失敗
48         }
49         sqlSession.commit();
50         return result;
51     }
52 
53     //用戶登錄 手機 密碼 成功2;密碼錯誤1;手機號錯誤0
54     public int right(String userPhoneNumber, String userPassword)
55     {
56         int result;
57         User user = mapper.getUser(userPhoneNumber);
58         if((user != null)&&(userPassword.equals(user.getUserPassword())))
59         {
60             result = 2;//登錄成功
61         }
62         else if(user != null)
63         {
64             result = 1;//密碼錯誤
65         }
66         else
67         {
68             result = 0;//此手機號未註冊
69         }
70         sqlSession.commit();
71         return result;
72     }
73 
74     //刪除用戶 成功是1,不成功是0
75     public int deleteUser(String userPhoneNumber)
76     {
77         int result = mapper.deleteUser(userPhoneNumber);
78         sqlSession.commit();
79         return result;
80     }
81 
82     //重設密碼
83     public int setPassword(String userPhoneNumber, String userPassword)
84     {
85         User user = new User(userPhoneNumber, userPhoneNumber, userPassword);
86         return mapper.setPassword(user);
87     }
88     public static void main(String[] args) throws IOException {
89         UserDao dao = new UserDao();
90 //        System.out.println(dao.deleteUser("111")); //刪除用戶
91 //        dao.addUser("111","111");// 添加用戶
92 //        System.out.println(dao.right("11"));//短信登錄;
93 //        System.out.println(dao.right("111","111"));//短信登錄;
94         System.out.println(dao.setPassword("111","111"));
95     }
96 }

 

以上為全部內容,之後還會寫一些關於IDEA操作上的快捷鍵,如,IDEA如何連接數據庫、快速生成pojo實體類等的博客。

如果運行異常,歡迎留言交流,共同進步!

這裏特別感謝博客: 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

微信 AES 解密報錯 Illegal key size 三種解決辦法

微信 AES 解密報錯 Illegal key size

Java 環境

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

問題

問題日誌
最近在遷移的服務器,在遷移完之後, 一個有關微信小程序的日誌打印下面的報錯信息。

c.t.b.a.c.weixin.aes.WXBizMsgCrypt - 小程序解密異常
java.security.InvalidKeyException: Illegal key size

解密失敗,看了下解密的密鑰是正確的,沒有任何問題。 這個在 經典 下是可以運行的,在 VPC 下運行不了。 (因為最近在進行阿里雲網絡遷移)

問題原因

微信在進行數據傳輸的時候,會進行加密,微信使用的 AES 加密使用的是 256位,Java 默認使用的解密包是 local_policy.jarUS_export_policy.jar,但是這個默認的只支持 128位的解密(java 版本在 1.8.0_161之後就沒有這個問題了,默認是支持)。我們的版本是 1.8.0_151 正好默認是只支持 128位的解密(其實不是不支持,只是默認配置的不支持)。

解決辦法

在前面我們沒有提及一個東西,就是在/usr/local/java/jdk1.8.0_151/jre/lib/security/policy/下有兩個目錄。

[root@djx-117106 policy]# pwd
/usr/local/java/jdk1.8.0_151/jre/lib/security/policy/
[root@djx-117106 policy]# ls -l
total 8
drwxr-xr-x 2 root root 4096 Nov  2 10:47 limited
drwxr-xr-x 2 root root 4096 Nov  2 10:47 unlimited
[root@djx-117106 policy]# ls -l ./limited/
total 8
-rw-r--r-- 1 root root 3405 Jul  4 19:41 local_policy.jar
-rw-r--r-- 1 root root 2920 Jul  4 19:41 US_export_policy.jar
[root@djx-117106 policy]# ls -l ./unlimited/
total 8
-rw-r--r-- 1 root root 2929 Jul  4 19:41 local_policy.jar
-rw-r--r-- 1 root root 2917 Jul  4 19:41 US_export_policy.jar

有一個 limited 目錄(也就是對解密有限制的包,只支持 128位),也有一個 ulimited 目錄(也就是沒有限制的目錄)。

更改 源碼

我們在 /usr/local/java/jdk1.8.0_151/jre/lib/security/ 下的 java.security文件中看到。

# To support older JDK Update releases, the crypto.policy property
# is not defined by default. When the property is not defined, an
# update release binary aware of the new property will use the following
# logic to decide what crypto policy files get used :
#
# * If the US_export_policy.jar and local_policy.jar files are located
# in the (legacy) <java-home>/lib/security directory, then the rules
# embedded in those jar files will be used. This helps preserve compatibility
# for users upgrading from an older installation.
#
# * If crypto.policy is not defined and no such jar files are present in
# the legacy locations, then the JDK will use the limited settings
# (equivalent to crypto.policy=limited)
#
# Please see the JCA documentation for additional information on these
# files and formats.
#crypto.policy=unlimited

注意下文中的 (equivalent to crypto.policy=limited) 說明默認是使用的 limited.
我們只需要加 crypto.policy=unlimited. 讓默認使用的不限制的。

替換Jar包

替換 /usr/local/java/jdk1.8.0_151/jre/lib/security/policy/limited的路徑的包。其實我們可以直接用 /usr/local/java/jdk1.8.0_151/jre/lib/security/policy/unlimited下面的包直接替換 /usr/local/java/jdk1.8.0_151/jre/lib/security/policy/limited/ 下面的兩個包。也就是讓默認使用不限制的jar包。

升級 Java 版本

https://www.oracle.com/technetwork/java/javase/8u161-relnotes-4021379.html
在官方文檔寫到,

security-libs/javax.crypto
 Unlimited cryptography enabled by default
The JDK uses the Java Cryptography Extension (JCE) Jurisdiction Policy files to configure cryptographic algorithm restrictions. Previously, the Policy files in the JDK placed limits on various algorithms. This release ships with both the limited and unlimited jurisdiction policy files, with unlimited being the default. The behavior can be controlled via the new 'crypto.policy' Security property found in the /lib/java.security file. Please refer to that file for more information on this property.

也就是從 1.8.0_161-b12 版本后,默認將採用無限制的加密算法,也就是使用 unlimited 下的jar包。我們也可以通過 設置 java.security 文件的 crypto.policy的值來改變這個默認的值。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

Go語言Hello world(GOPATH和Go Module版)

本文是「vangoleo的Go語言學習筆記」系列文章之一。
官網:

往期回顧:

上一篇文章中,我們在Golang Playground中體驗了Go語言,編寫並運行了一個簡單的Hello World,相信大家對Go語言的語法有了一些了解。

學習一種編程語言,除了基本的語法,更重要的是要了解如何在實際的工程中使用它。本文中,我會和大家一起,從零開始,安裝Go語言,配置環境,安裝IDE,開發一個Hello World程序。這個Hello World版我會編寫兩個版本:GOPATH和Go Module版本。

Q:
本教程為什麼會編寫兩個版本?
A:
網上大部分Go語言Hello World都只簡單地介紹了GOPATH版本。但是從Go的1.11版本之後,已不再推薦使用GOPATH來構建應用了。也就是說GOPATH被認為是廢棄的,錯誤的做法。
正確的做法是使用Go Module。所以,有必要在教程中將這個信息告訴初學者,引導大家使用推薦的最佳實踐方式Go Module。
或許這也是本Hello World教程和網上大部分教程的區別吧。會從開發者的實際使用出發。介紹Go語言的發展歷史和最佳實踐。

安裝Go

使用Go語言開發,第一步肯定是安裝Go啦。

第一步:進入Go語言的官網https://golang.org。點擊“Download Go”。是的,就是那個傻傻的土撥鼠^_^

第二步:根據操作系統下載對應的軟件包進行安裝。
Golang對主流的操作系統都有支持,比如Windows,MacOS和Linux等。
本系列教程中,我會使用MacOS操作系統,所以選擇下載“Apple macOS”。大家要根據自己的操作系統進行下載。

第三步:安裝Go。
在MacOS下安裝Go很簡單,就是標準的DMG文件安裝,直接“下一步”就可以了。
第四步:確認Go是否安裝成功。
運行命令“go version”,會輸出類似於“go version go1.12.9 darwin/amd64”的內容。請確保包沒有任何錯誤發生。

配置環境

和其他開發語言類似,安裝了Go之後,還需要對開發環境進行相應的配置。比如在Java中,需要配置JAVA_HOME,MAVEN等。
Go開發相關的環境變量如下:

  • GOROOT:GOROOT就是Go的安裝目錄。
  • GOPATH:GOPATH保存go項目代碼。

GOROOT

GOROOT是Go的安裝路徑。Mac中安裝Go會自動配置好GOROOT,路徑為/usr/local/go。GOROOT在絕大多數情況下都不需要修改。以下是GOROOT目錄的內容(已省略了一些無關信息):

tree -L 2 /usr/local/go

./
├── bin
│   ├── go
│   └── gofmt
├── doc
│   ├── articles
│   └── docs.html
├── src
│   ├── errors
│   ├── fmt
│   ├── log
│   └── os

可以看到GOROOT下有bin,doc和src目錄。bin目錄下有我們熟悉的go和gofmt工具。可以認為GOOROOT和Java里的JDK目錄類似。

GOPATH

GOPATH是開發時的工作目錄。用於:

  • 保存編譯后的二進制文件。
  • go getgo install命令會下載go代碼到GOPATH。
  • import包時的搜索路徑。

關於GOPATH需要特別注意。在GO的1.11版本之前,GOPATH是必需的,且所有的Go項目代碼都要保存在GOPATH目錄下。Go的1.11版本之後,GO官方引入了Go Module。使用Go Module管理的項目可以放在GOPATH目錄外面。

使用GOPATH時,GO會在以下目錄中搜索包:

  1. GOROOT/src:該目錄保存了Go標準庫代碼。
  2. GOPATH/src:該目錄保存了應用自身的代碼和第三方依賴的代碼。

假設程序中引入了如下的包:

import "github.com/tom/hello-go/foo/bar"

第一步:Go會先去GOROOT的scr目錄中查找,很顯然它不是標準庫的包,沒找到。
第二步:繼續在GOPATH的src目錄去找,準確說是GOPATH/src/github.com/tom/hello-go/foo/bar這個目錄。如果該目錄不存在,會報錯找不到package。在使用GOPATH管理項目時,需要按照GO尋找package的規範來合理地保存和組織Go代碼。

Go的這個“將所有代碼都放置在GOPATH中”的設計,的確是和其他主流語言很不一樣。不管Go官方是出於什麼考慮,這個設計在實際使用中,的確給開發者造成了很大的不便和理解上的困難。甚至直接勸退了很多Go的初學者。
萬幸的是,Go Module正式發布了。Go Module的發布解決了困擾Go語言長達十年的代碼組織,依賴管理問題。

說明:關於GOPATH和Go Module的歷史淵源,詳細使用,會在另一篇進行說明。本文還是聚焦在Hello World入門。

另外,由於某些原因,Go的某些託管在Google倉庫中的代碼在國內是無法訪問的。如果使用Go Module,我們可以設置GOPROXY,讓Go從GOPROXY下載Go代碼,速度更快。國內用戶可以設置GOPROXY為,使用如下命令來設置GOPROXY:

export GOPROXY=https://goproxy.cn

關於環境配置,總結下來就是:

  • 如果使用Go Module(推薦的),設置export GOPROXY=。
  • 如果使用GOPATH(遺留的,被廢棄的),需要設置GOPATH到本地的某個目錄。

安裝IDE

目前比較常用的IDE有:

  • Visual Studio Code
  • GoLand

Visual Studio Code是微軟開發的一款開源的,輕量級的文本編輯器。通過安裝Go插件,可以用於Go語言的開發。GoLand是JetBrains公司開發的,專業的Go語言開發IDE。

推薦使用GoLand。很多人都說Visual Studio Code更輕量級,但作為一款每天都要重度使用的,需要靠它吃飯的工具,我們需要的是功能全面。尤其是當你需要完備的調試,需要強大的IDE智能輔助功能時,相信你會選擇更專業的GoLand。

GoLand的官方主頁為https://www.jetbrains.com/go/,點擊“Download”即可下載

注意
GoLand使用的是和IntelliJ IDEA一樣的框架,是用Java語言開發的。你需要安裝Java環境才可以運行GoLand哦。

GoLand是收費軟件,只有30天的試用期。試用期結束后,需要購買授權。當然在天朝,我們都習慣不花錢用軟件。大家可以自行百度或google搜索一下。

Hello World(GOPATH版)

第一步:設置GOPATH
首先設置GOPATH,假設GOPATH設置為$HOME/worspace/go
第二步:創建子目錄
進入$HOME/workspace/go目錄。新建子目錄src。然後再src中新建子目錄hello。在hello目錄,新建一個hello-world.go文件:
目錄結構應該如下所示:

$HOME
  workspace
    go
      src
        hello
          hello-world.go

第三步:創建hello-world.go文件:

package main
import "fmt"
func main() {
    fmt.Println("hello world")
}

第四步:執行go build
$HOME/workspace/go目錄執行命令:

go build

會生成一個可執行二進制文件:hello。如果是Windows系統,會生成hello.exe文件。
第五步:運行hello文件:

./hello

hello world

輸出“hello world”。

Hello World(GO Module版)

第一步:創建項目的根目錄
任意創建一個目錄(可以不在GOPATH中),假設是$HOME/tmp/hello。
第二步:初始化Go模塊
執行命令:

go mod init github.com/vangoleo/hello

該命令會將hello目錄初始化為一個Go module,並生成一個$HOME/tmp/hello/go.mod文件。內容如下:

module github.com/vangoleo/hello

go 1.12

第三步:編寫hello.go文件
編寫文件$HOME/tmp/hello/hello.go:

package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

第四步:編輯go.mod文件:
在實際項目中,都會使用到第三方庫。可以在Go Module中添加項目的依賴。本例中,我們會添加一個quote依賴,該依賴會打印當前語言的“Hello World”,比如,如果是中文環境,會打印“你好,世界”。
編輯go.mod文件,添加quote依賴:

module github.com/vangoleo/hello

go 1.12

require rsc.io/quote v1.5.2

第五步:執行go build
執行go build,會生成可執行文件$HOME/tmp/hello/hello
第六步:執行hello文件
執行hello文件,輸出“你好,世界”。

最後

本文中,我們從下載安裝,配置Go環境開始,並完成了GOPATH和Go Module兩個版本的Hello World應用。如果你跟着我一步一步完成了這些步驟,恭喜你!!!已經完成了第一個真正的Go應用,並且使用了正確的Go Module來管理Go程序。

接下來,我們可以開始學習Go語言的語法部分(基本數據類型,判斷,循環等)了。咋們下期見。

本文由 發布

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?

南韓樂天化工廠爆炸致數十人傷 暫無有害物質洩露

摘錄自2020年3月4日星島日報報導

南韓樂天集團旗下一間化學工廠凌晨發生爆炸,造成至少30多人受傷,暫未發現化學物質洩露。

據報該化工廠位於忠清南道瑞山市,在今(4日)凌晨發生爆炸,產生強烈衝擊波。韓媒報道稱,爆炸導致多處建築物倒塌,附近房屋受損嚴重,窗户被震碎,多處設施受损。據忠清南道消防部門消息,截至當地時間下午3時,爆炸造成至少36人受傷,目前2人傷勢嚴重,暫未有人死亡。當地警方稱,可能是在生產乙烯和丙烯的壓縮過程中發生事故。

樂天化學公司發表聲明稱,由於鉛絲分解過程出現問題,導致爆炸;目前該工廠已停工,將進一步調查具體原因。事故發生後,瑞山市政府向民眾發信息提示注意安全,但同時稱沒有造成有害化學物質洩露,不需要進行撤離。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

COP26主題定調金融 聯合國氣候特使:零碳帶來當代最大商機

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?

工信部:新能源汽車今年將翻番 騙補企業要嚴處

全國“兩會”期間,新能源車產業的發展受到更多關注。

騙補調查取得成果

在全國“兩會”的“部長通道”,苗圩接受媒體採訪時表示,已經發現一些地區個別企業存在騙補行為,現在還在進一步查處,無論涉及到誰都會嚴肅處理。值得注意的是,這距離工信部宣佈對新能源車騙補行為進行調查不足兩個月。

新能源汽車2016年保持一倍以上增長

在公佈新能源車產業騙補調查進度的同時,對於新能源車在2016年的發展情況,苗圩認為,中國新能源車目前已經進入成長期,同時也代表著汽車產業調整的方向。“新能源汽車將保持高增長態勢,預計今年有一倍以上的增長。”苗圩說。

中國汽車工業協會發佈的資料顯示,2015年我國生產新能源汽車約34萬輛,銷售約33萬輛,同比分別增長3.3倍、3.4倍。

另外,在車企方面,自主品牌、合資品牌等都開始重視新能源車車型的研發和生產。根據汽車集團此前發佈的“十三五”規劃顯示,上汽集團未來五年新能源業務將新增投入200億元,新能源車目標銷量為60萬輛;廣汽集團則到2020年新能源汽車產銷規模力爭突破20萬輛;奇瑞汽車力爭新能源汽車到2020年產銷規模達到20萬輛。

面臨兩個瓶頸

苗圩認為,在新能源車保持高速發展的同時,目前新能源汽車仍面臨兩個瓶頸,“一是產品端,要集中攻克以動力電池為代表的產品性能、可靠性、續航里程、壽命等難題;二是應用端,要重視社會充電設施建設等”。苗圩表示。

2月24日,國務院常務會議就提出,動力電池核心技術的研發與政府獎勵掛鉤以及引入社會資本構建新能源車基礎設施等幫助新能源車產業發展的新措施。

具體而言,中央財政採取以獎代補方式,根據動力電池性能、銷量等指標對企業給予獎勵,加大對動力電池數位化製造成套裝備的支援。另外,國家還將利用中央預算內投資和配電網專項金融債等支持各地充電設施建設,鼓勵地方建立以充電量為基準的獎勵補貼政策,減免充電服務費用。

文章來源:北京商報

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

寶馬 i 系電動車2015年全年銷量為29513輛

近日,寶馬集團發佈了寶馬 2015年的財報, 2015年,寶馬集團銷量達到2,247,485輛,同比增長6.1%。(2014年:2,117,965輛)。

2015年,BMW品牌全球銷量增長5.2%,至1,905,234輛(2014年:1,811,719輛)。其中,BMW 2系、4系以及BMW X家族表現突出,促進了銷量增長。

另外要提一下寶馬的新能源車型 BMW i 系,該車型實現了65.9%的增長,共交付客戶29,513輛(2014年:17,793輛),其中,BMW i3在全球範圍的銷量增幅為49.9%,共售出24,057輛(2014年:16,052輛),BMW i8銷量達到5,456輛(2014年:1,741輛)。

寶馬其他車型銷量還包括 MINI 品牌:交付量增長 12.0%,達338,466 輛(2014年:302,183 輛);勞斯萊斯:全球共交付客戶3,785輛,其中魅影和古斯特對銷量做出最大貢獻。另外,2015寶馬集團的全球前四大市場是中國、美國、德國和英國。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?