Go編程: 那些隱晦的操作符

2021-02-15 Go語言中文網

本篇作為 Go 編程「邊角料」的最後一篇,主要針對 Go 語言提供的操作符進行一次總結。剛好回應上篇一位讀者關於表達式是否要加'.'的問題做個回復。

在 Go 語言中,一共提供了47個操作符,包括標點符號。摘自官方文檔,分別是:

+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=

除以上操作符以外,在 Go 語言中還有一個特殊的符號 _, 以及一個非 Go 語言操作符的特殊字節?。

刨去一些常用的操作符,對其中較隱晦操作符做個簡單的備註,方便不時之需。就隱晦本身而言可以劃分為兩類:

1. 符號隱晦

上文中的 47 個操作符,一個個看下來,真正隱晦的符號基本上都是位運算操作符或相關操作符。之所以隱晦,因為位運算在大部分開發人員的日常開發中屬於非常規操作,因為運用得少,而增加了其陌生感。不妨簡單羅列一下:

& bitwise AND integers
| bitwise OR integers
^ bitwise XOR integers
&^ bit clear (AND NOT) integers

<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer

寫個簡單的例子, 強化記憶:

package main

import "fmt"

func main(){
fmt.Printf("AND: a(%b) & b(%b) = (%b)\n", 4, 5, (4 & 5))
fmt.Printf("OR: a(%b) | b(%b) = (%b)\n", 4, 5, (4 | 5))
fmt.Printf("XOR: a(%b) ^ b(%b) = (%b)\n", 4, 5, (4 ^ 5))
fmt.Printf("AND NOT: a(%b) &^ b(%b) = (%b)\n", 4, 5, (4 &^ 5))

fmt.Printf("Left Shift: a(%b) << 1 = (%b)\n", 5, (5 << 1))
fmt.Printf("Right Shift: a(%b) >> 1 = (%b)\n", 5, (5 >> 1))
}

輸出的結果是:

AND: a(100) & b(101) = (100)
OR: a(100) | b(101) = (101)
XOR: a(100) ^ b(101) = (1)
AND NOT: a(100) &^ b(101) = (0)
Left Shift: a(101) << 1 = (1010)
Right Shift: a(101) >> 1 = (10)

位操作符並不難,之所以隱晦,主要是實際運用的少導致的。其中,XOR 運算有個特點:如果對一個值連續做兩次 XOR,會返回這個值本身。XOR 的這個特點,使得它可以用於信息的加密。阮一峰這篇文章XOR 加密簡介很好讀。

與位運算符相關的符號,有:

<<= >>= &= ^= |=

其功能與+=是一樣的,即 a += 1 等同於 a = a + 1。

2. 場景隱晦

另一類操作符,看似非常簡單,但因其在不同應用場景下產生了不同功能效果,導致在使用上的陌生。

2.1 符號 '_'

符號 '_', 又稱為空標識符(Blank identifier)。它有兩種使用場景,不同場景提供的功能是不同的.

此時符號 '_', 功能與 /dev/null 類似,只負責接收值並直接丟棄,無法取回。

ar := [10]int{1,2,3,4,5,6,7,8,9,0}
for _, v := range ar {
println(v)
}

常規情況下,包引用格式是這樣的:

package YourPackage

import "lib/math"
import m "lib/math"
import . "lib/math"

具體語法意義不解釋了。現在看看 '_' 在包引入中的功能。

import _ "the/third/pkg"

此時引入的第三方包"the/third/pkg",如果引入的結果是一個空標識符'_'。按其空標識符的原始意義,就是對於使用方而言,沒有任何意義,因為無法使用被引入包中任何變量或是函數。

但是,這種引用有一個副作用,就是:會對第三方包進行編譯並且執行初始化func init()操作.這一功能,對於某些引用方就非常有用。

所以當我們研究一些開原始碼時,看到類似的引用import _ "the/third/pkg"時,直接跳到引入包的init函數,就可以建立起內在邏輯。不妨看一下github.com/golang/protobuf/protoc-gen-go/link_grpc.go的代碼, 這就是grpc插件註冊到protoc-gen-go的地方。

package main

import _ "github.com/golang/protobuf/protoc-gen-go/grpc"

2.2 符號 '.'

符號 '.' 常規情況下是作為選擇器的在使用。如:

//直接選擇屬性名或函數名
x.FieldName
x.FunctionName

還可以做為包引用使用,如上節。

import . "lib/math"

它的作用有點類似當前目錄符'.'的意思了,簡化掉了包引用的相對路徑。

還有一個用法,即類型斷言(type assertion)。

//類型斷言: 類型必須用'()'括起來
v, ok := x.(T)

作為類型斷言時,類型必須用'()'括起來,防止和選擇器功能混淆。類型斷言與類型轉換需要區分一下。

//類型轉換: 變量必須用'()'括起來
v := T(x)

區別:

2.3 符號 '...'

符號 '...' 主要用於不定參數與切片打散功能。非常簡單,備註一下。

不定參數

import "fmt"

func Foo(args ...interface{}) {
for _, arg := range args {
fmt.Println(arg)
}
}

切片打散

args := []interface{}{1, false, "hello"}
Foo(args...)

數組長度

[...]int{1,2,4}

2.4 符號 '?', 非 Go 語言操作符

很多語言都支持符號 '?', 但是在 Go 語言中並它不屬於系統操作符, 雖然在 Go 代碼中經常會碰到符號 '?'。在語言級別符號 '?' 沒有任何語法意義,只是一個常規的字節。

常見使用場景是做為 SQL 語句的替換符使用。如:

import "database/sql"

id := 47
result, err := db.ExecContext(ctx, "UPDATE balances SET balance = balance + 10 WHERE user_id = ?", id)
if err != nil {
log.Fatal(err)
}

其中的符號 '?' 僅僅與依賴包database/sql有關,與 Go 語言本身無關。在database/sql包中,字符 '?' 可以將任意類型參數變量替換轉義成 SQL 字符串合適的類型值。

推薦閱讀

喜歡本文的朋友,歡迎關注「Go語言中文網」:

Go語言中文網啟用微信學習交流群,歡迎加微信:274768166

相關焦點

  • Go語言無孔不入的2016:躋身主流程式語言、國內大熱、極速提升、尖端應用……
    如果你關注TIOBE的程式語言排行榜就會發現,截止到2016年11月,Go語言從原先的第50多位經過多次上竄已經躍到了第13位,躋入絕對主流的程式語言的行列!這份排行榜每月都會更新,並基於網際網路上的程式設計師老鳥、教學課程和相關廠商的數量進行排名。在國內,從我這幾年運營Go語言北京用戶組的經歷來看,可以明顯地感覺到Go語言的在國內的大熱。
  • TIOBE 2017年1月語言排行榜:Go語言榮獲2016年度程式語言
    TIOBE每年會將年度程式語言的桂冠頒發給當年最受歡迎的程式語言,而今年幾乎無需競爭,谷歌的Go語言便以大比分輕鬆拿下了這項榮譽。
  • 「小鬼」遇上「編程特工」
    10月31-11月1日天津【河東區遠洋未來廣場】首都電影院(影廳內)編程特工隊登陸地球第四站【河東遠洋*圖片來源:往期活動超級躲避障礙賽車,模擬真實躲避障礙賽,通過控制手中的編程賽車,在特定賽道,成功躲避各種障礙物,最終到達終點,即可挑戰成功,
  • Hopscotch:別玩樂高了,跟我一起跳房子學編程
    兒童節當天芥末堆盤點了國外常見的少兒編程類產品,接下來會選取部分有代表性的產品分享給大家,今天要介紹的是「編程樂高」——Hopscotch。
  • Fortran編程:其實也沒那麼難
    可不是嘛,想到編程,確實是有些ugly和dark吧。或許是大學時候學習C語言之類勉強得個80多分,稀裡糊塗考過了C語言二級的陰影仍然在的緣故吧。事實上,當你真正面對Fortran,必須用它的時候,很快你就發現,Fortran,其實也沒那麼難!這裡給各位分享一下入門Fortran的一些方面。不妥之處,請指正!
  • 2017年程式語言排行榜:Python高居首位!
    IEEE Spectrum 發布了第四屆頂級程式語言交互排行榜。
  • 今晚 /武昌/ 街道殺死奇怪的動物:隱晦而銳利的黑暗寓言
    於是,「街道殺死奇怪的動物」樂隊在沉寂四年後帶回給我們的新專輯《麥當勞少年》裡,那些夾雜在扭曲失真的噪響曲調中隱晦而銳利的黑暗寓言,似乎顯得有些不合時宜。
  • 2020符姓排名139位 國內140萬人
    「符」,請您先點擊上面的藍色字「符氏宗親總會」,再點擊「關注」,即可成功加入中華符氏大家庭。海南姓氏排名,前四位—王陳符李西沙群島第一大姓——符姓文昌市第一大姓——符姓海南儋州市第一大姓——符姓越南建江省河仙郡雲中村第一大姓——符姓海南東方市第一大姓符姓海南昌江縣第一大姓——符姓海南白沙縣第一大姓——符姓海南臨高縣第三大姓——符姓
  • 科普篇:樂高編程是怎麼一回事?
    樂高機器人編程        樂高編程是建立在樂高積木上的編程,更注重的是軟硬結合的編程教育!        許多語言都對Mindstorms進行編程,Computer Clubhouses是專注於Mindstorms編程的網站。LEGO MINDSTORMS Robotics Invention System(以下稱為樂高機器人套件),是針對12歲以上的小孩或大人,對機器人有興趣(或者啟發自動控制教育)的教育玩具。
  • 少兒編程:適合5-7歲的幼兒編程遊戲(lightbot)帶模擬器
    最近發現了一個很好玩的編程小遊戲——LightBot。
  • 廣東廉江山車村符氏宗祠掀起改革浪潮
    隨著2010年以來,世界符氏宗親聯誼越來越多,很多遷徙外地的年輕宗親回來祭祖,希望改革這個慣例。這些年來,符毅、符斌等宗親努力改革,鼓勵更多年輕人參與祭祖事務。在他們的影響下,今年冬至前夕,符兆柱、符增冠等宗親開始大規模動員更多年輕人參加祭祖儀式,聚餐費用由大家捐助開支。今天,熱鬧非凡,外地宗親紛紛點讚,證明這場改革取得空前成功。當然,餘下資金如何處理、是否成立宗親會等事宜,仍有待明年進一步改善。
  • 龍門銑床的安全操作方法
    官方提示:點↑"UG編程"關注,免費學UG龍門銑床包括數控龍門銑床
  • 名人說編程:let's code
    前美國總統歐巴馬:別光玩手機了,來編程吧。蘋果公司聯合創辦人賈伯斯:我認為這個國家的每個人都應該學習編程,因為它可以教會你如何思考。微軟創始人比爾蓋茲:學習編程開拓你的思維,幫助你更好地思考,創建一個在所有領域都有益的思考方法。Facebook CEO扎克伯格:在十五年的時間裡,我們將會像閱讀和寫作一樣地教編程。。。
  • TIOBE 9月程式語言榜:Python超C++
    TIOBE程式語言排行榜前十,之後它被越來越多的人肯定,名次逐漸向前五名靠近,最終進入前三。它已經是各大學的首選程式語言(適用於需要編程的各種科目),如今還徵服了工業界。Python的特點是易於學習,易於安裝且易於部署。此外,排名第一的Java和第二的C語言,在本月都出現了不同幅度的上漲,但願這兩門語言能夠守住自己的位置。
  • 這張敲靈的2021幸運符,快收下!
    深呼吸一口氣,閉上雙眼不斷念叨「2021,對我好1點吧」用迅雷不及掩耳的速度截屏抽取屬於你的2021幸運符吧↓ ↓ ↓你以為事情就這麼簡單?阿器今天要給你雙倍好運分享你的專屬幸運符和祝福語就有機會喜提限量特別版好禮(阿器居然沒份嗚嗚嗚!!)step1:截取你的幸運符圖片,發送到【QQ瀏覽器】公眾號後臺。
  • 寓教於樂:教你學編程的 5 款遊戲
    Specs 翻譯整理原文:http://sixrevisions.com/resources/games-that-teach-how-to-code/譯文:http://info.9iphp.com/games-that-teach-how-to-code/(點擊尾部閱讀原文前往)這些WEB遊戲非常有趣,可以把你帶入迷人的編程世界
  • ICCM國際創意編程挑戰賽主題發布
    ICCM國際創意編程挑戰賽突破傳統的編程大賽模式,從創新的角度,以創意編程方程為方向,來培養學生正確的科學觀和邏輯思維,在挑戰賽中開闊視野增長見聞,在創新創造中不斷成長。 ICCM分為初賽和決賽兩個階段,初賽將根據選手提交的團隊創意編程作品進行篩選,從中選出一批優勝者進入決賽。
  • 學計算機編程開發:應該學習哪一種程式語言,C++還是C#?
    這樣問的問題確實很難回答,因為您尚未指定任何編程背景或特定意圖。從您願意點擊進來閱讀這篇文章來看,我認為您是編程的初學者。
  • 祥符新「紅色引擎」釋放發展動能
    杭州銀泰城黨群服務中心地處拱墅區十大產業平臺之一——申花產業集聚區的核心區域,是拱墅區祥符街道在商圈、樓宇黨建工作中打造的「重要窗口」和示範點。走進杭州銀泰城黨群服務中心,可愛的卡通形象恩加(N+)寶寶隨處可見,它的形象由「黨建魔方」這一概念衍生而來。中心設立了「黨群之家」和「企業之家」,多功能會議室、咖啡吧、僑之家、融媒體中心等功能區域。
  • 辦公小技巧:排好「字外符」或「字外框」
    實際上,如果使用WPS2019辦公軟體,「字外符」或「字外框」的編排問題便可以輕鬆解決。1. 給已故作者名加上顯眼提示符書籍製作時,作者列表中若有已故作者,常常會對該作者加框排版。此前曾見到過有人用疊加矩形圖形的辦法給人名加框的,但該法在版面變動後很容易錯位。