今天因應同事提的一則需求,寫了一段
CASE WHEN 的整數與小數處理

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼:

前言:

这一系列文章取自我在2013年出版的《一个人的出版史》一书,完整说明请参阅2012年序;您可以免费下载本书简体完整版ePub或PDF,其他阅读和下载渠道则请参考介绍网页。简书版完整列表在此。

過程中居然踩了個雷,特此記錄下來

package main    import (        "fmt"    )    func main(){        var x,y int=1,2        {            var x int=2            {                var x int=3                fmt.Println    //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何?            }            fmt.Println        //其次輸出2,2        }        fmt.Println            //最後輸出1,2    }
寫於2009年4月26日#####

前篇寫到企業文件的「科技專業度」,問題其實還沒講完;因為「編輯專業度」問題(這也是我臨時取的名詞)屬於另外一類,所以放到這篇來寫。

所謂「編輯專業度」,指的是把一些原本只在專業報刊版面,或是拿西方的字型或文書編輯規則,套用在一般企業文書上的做法。這些規則有些是來自古老的打字機時代、也有些是因為打字機時代結束而出現;不遵守這些規則並不會怎麼樣,頂多只是影響日後修改的便利性、(跟「科技專業度」一樣)給內行人的觀感不同、以及某些時候可能影響整體外觀而已。

首先,需求如下:

執行結果我已經加到註釋內了,其實沒必要好奇,GO語言就是如此,這種突然出現的大括號構成了複合語句,大括號內的變量作用範圍只能在變量內部,這就涉及到變量的作用域了,在PHP中變量也是有作用域的,但是PHP遇到這種突然出現的大括號時不會構成這種複合語句,因此也就不會影響到變量的作用域,這一點請謹記
其次我們在PHP中的function內使用全局變量的時候通常要用global把全局變量引入進來,但是在GO語言中不需要那麼麻煩,全局變量如果出現在function前邊就可以直接在function內使用,而不需要額外的描述,在GO語言中,全局變量的作用範圍是當前的package,局部變量的作用域被限制到了其所在的大括號內.

空白符號的使用###

以電腦文書處理而言,最常見的編輯問題之一是空白符號(也就是英文的space)的使用方式。有些人習慣在分段前面加上2個到5個不等的空白符號、有人習慣在英文句號後面打兩個space;簡單的說,這些都是打字機時代留下來的規矩,現在都已經不再使用。

當打字機只有一種字型、而且每個字母的寬度都一樣(所謂「monospace」字型)的時候,確實必須用一些特別的方式來標示段落起始、或是新的句子開始的地方;但現在這些通常並不需要。

如果一定要用縮排(indent)的方式來標示段首,比較專業的方式是用固定距離(例如0.5吋)的tab符號(按鍵盤左上角的tab鍵)來取代幾個空白符號。tab和空白鍵不同的地方,在於tab是以設定的距離為準,所以無論字型和大小如何變化,都會保持固定的寬度;反之,如果用的是space鍵,只要字型一有變化就會改變寬度,有時候甚至可能弄壞整個排好的版面。此外,用space鍵無法調出「小於1個字母」的寬度變化,但以寬度為準的tab鍵卻可以。

如果是中文文章、而且一定要用空白符號來做段首縮排的話,最好是用全形空白符號。原因有兩個:

  • 中文是方塊字,每個字都一樣寬,包括空白符號在內;如果用英文space,還是會有上述的寬度變化問題。
  • 如果是電子檔文章轉用到網頁上,段首的空白也會保留;如果是好幾個連續的英文space的話,反正HTML網頁程式只會保留1個,失去了縮排效果。

關於為什麼現代英文文件之中,句號後面不再使用兩個space,理由如前所述:單寬度字型打字機所需的「用兩個space標示句子結尾」方式已經過時;詳細說明請<a
href=’

當內容為整數或零時則去掉尾端的小數否則就顯示原本的小數內容

上一篇文章我在介紹數據類型的時候有提到一個數據類型轉換的部份,在此跟大家說一下GO語言是如何轉換數據類型的.
首先我們要清楚,GO語言是類型安全的,它不允許數據類型隱式轉換否則會造成精度丟失,在go語言中所有的類型轉換必須要顯式進行才可以.
其顯式轉換方法其實非常簡單
變量1=<變量1的類型>(<變量2>)
例如:
v1:=3.14
var v2 int
v2=int
上例我把浮點型的v1顯式轉換成了int型.此時v2的值是3
在顯式轉換的時候有幾點需要注意一下:
int型可以轉為float型
float型可以轉為int型
string型可以轉為[]byte和[]int型
[]byte可以轉為string型
[]int可以轉為string型
除此之外別的都不可以.
這樣的類型轉換可以保障變量的類型是安全的,不會像PHP那樣類型被偷偷轉換了,例如:
var_dump;
這句代碼按理說應該是兩個string串接輸出string才對,但是PHP的隱式轉換把他的類型給改了,變成了int,這種狀況在GO語言中是不會發生的.
除了這種類型轉換方式之外GO語言還提供了一個標準的package用來對數據類型進行轉換,這個package的名字是strconv,它提供的方法有:
Atoi (bool,error) 接收字符串參數轉為Int型
Itoa 接收Int型參數轉為字符串
FormatBool string 接收布爾參數轉為string型
FormatFloat(float64,浮點格式,輸出精度,[位數32,64]) string
接收布爾參數轉為string型
FormatInt(int64,[進制2,8,10,16]) string
接收int型參數根據進制轉為string型
FormatUint(int64,[進制2,8,10,16]) string
同上,接收無符號int型參數根據進制轉為string型
ParseBool (bool,error) 接收字符串參數轉為bool型
ParseFloat(字符串,[位數32,64]) (bool,error)
接收字符串參數轉為Float型
ParseInt(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error)
接收字符串參數轉為Int型
ParseUint(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error)
同上,接收字符串參數轉為無符號Int型

全形與半形###

也許是我個人的毛病,我並不喜歡看到全形的英文或數字夾雜在中文裡頭,像是「共有1125公里」這樣;主要是因為遷就中文字寬度相同的關係,如果英數字用了全形的話,就像是在文章中挖出一個個破洞一樣。

使用全形數字唯一的優點,就是在中文直排、而又只有一位數字的時候,數字不會被旋轉90度。

另外一個相關的問題,則是在中文裡頭使用半型標點符號、或是類似半型的標點符號,像是「總經理表示:”今天…”」或是「他說:〝這樣…〞」。用這類符號(尤其是引號)的問題多到不可勝數,像是:

  • 用半形引號跟中文不搭,而且半形標點符號也會有和中文寬度不一致的問題;
  • 用在文章中時(相對於寫程式之類非文章用途),英文引號的正確用法其實是有方向性的,也就是所謂的「smart
    quotes」或「curly
    quotes」(例如「“quotes”」);但大多數中文使用者不瞭解這個用法,常常會變成兩側使用相同的引號,全形或半形皆然。</li></ul>

簡單的說,比較好的處理方式是「中文歸中文、英數歸英數」,也就是中文內容使用中文全形符號,英數字就用正確的英數半形符號;雖然多少還是可能有例外、或是個別用途的體例要求有所差異,但大致上應該就不會錯。

如果要再講究一點,還有「避頭點」(每一行的第一個字不能是標點符號)或「孤獨行╱字」(每一欄或每一頁啟始處不能只有一行字、或是每一段的最後一行不能只有一個字或一個標點)等等;有些比較聰明、或是亞洲化得比較徹底的文書或排版軟體,會把這部份的自動處理功能加進去。不過以一般企業文書的標準來看,這方面就不一定要那麼要求了。

一般來說,網頁文件在這些方面的要求會比較鬆;因為HTML語法比文書處理軟體的限制更加嚴格,某些符號或編排方式也很難做得出來;而且在不同的系統平台或瀏覽軟體上,顯示的效果也不盡相同,所以內文本身的格式越簡單越好。反而某些中文全型符號佔了「HTML語法不認得」的優點,在使用時限制較少;例如在文件中使用「&」或「@」半形符號,事後要貼上網頁時,由於HTML語法也會用到,所以可能造成問題,但如果改用同樣的全形符號就可以解決。

瞭解文件內容的編排原理,在跨平台或跨系統顯示、將內容轉換到網頁上、甚至只是在文書軟體中改變設定時,都可以減少版面跑掉、產生亂碼,甚至導致網頁無法正確顯示、或是輸出印刷網片時產生的不明問題。至於自己列印或單純的螢幕顯示,問題倒是不會太明顯;大概也因為如此,大多數人並不十分重視這些。

說到文件編輯的「專業度」,還有一件稍微相關的事情要提醒一下:當文件在公司內部流通修改的過程中,如果使用了像是Word之中的「追蹤修訂」(Track
Changes)功能,在將文件送出去給客戶或媒體時,記得要把修訂記錄清除掉,以免外界人士把一堆不該流出的內部資訊看個精光。:)

(後記:寫完一會兒之後自己重看這篇文章,覺得因為實在懶得做附圖的關係,所以如果沒有一點編輯實務經驗的話,可能會看不太懂我在說什麼;但如果有經驗、而且師父有教的話,大概也不用我多嘴了。

其實,這裡面牽涉到的編輯體例、以及所謂typography的西式排版規則等等,已經可以用整本書來講了,例如我手上的這本「<a
href=’
Typography
Sourcebook</a>」;至於這篇不清不楚的短文,則只能聊表心意、略盡棉薄而已了。)

若內容為 NULL
也維持不變

這些方法在進行數據類型轉換的時候也是非常有用的,需要格外注意一下.

例如: 120.000
要顯示為 120 , 而 120.12345 則維持不變 

那麼接下來的時間我們就主要介紹一下GO語言的流程控制,這個部份主要涉及到if;switch;和循環,
首先我們來看一下if部份.首先我們看一下下邊這段代碼:

在聽完需求後,我快速寫了以下這段
CASE WHEN 判斷

var a int    a=xx()    if a==1{        fmt.Println    }else if a==2{        fmt.Println    }else{        fmt.Println    }

图片 1

通過上邊的代碼不難發現其實GO語言的if寫法和別的編程語言幾乎沒有差別,但是要注意一點,那就是條件語句不能出現小括號,還有就是左大括號必須要出現在判斷語句的尾部,不能寫到新的一行.就像上邊的這個demo就不能這樣寫:

但看起來行不通阿!!!
可以看到我在 THEN 的時候直接轉成INT類型,但出來的結果還是DECIMAL類型
此時同事說了句,是不是有可能型態在CASE WHEN時就已經決定了

var a int    a=xx()    if                //這是第一個錯誤    {                       //這是第二個錯誤        fmt.Println    }    注意一下這兩點就差不多了,除了上邊說的這個注意事項之外還有一點需要注意的地方,請看下邊的代碼:    if a:=xx();a==1{        fmt.Println    }    fmt.Println          //這是錯誤的,因為變量a屬於if的區域變量

經過測試大致整理出邏輯如下

在這個demo中變量a被放到了if同一行中,此時a就屬於這個if的區域變量
總結一下,在GO語言中if在使用的時候要注意三點就足够了,分別是:1.條件語句不能有小括號,2.左大括號必須要放到語句的結尾,3.其他語句可以放到提交語句的左側,此時若有給變量賦值,那麼這個變量的作用範圍被局限在if內

CASE WHEN
是透過所有 THEN 值的型態優先順序,來決定最終型態為何

接下來我們看一下GO語言的switch用法,首先我們來看一下下邊的代碼:

发表评论

电子邮件地址不会被公开。 必填项已用*标注