【Go语言】【4】GO语言类型和为类型增加方法
一、GO語言的類型
GO語言中內置了如下基礎類型:
整型:byte(int8)、int16、int、uint等
浮點型:float32、float64
復數類型:complex64、complex128
布爾類型:bool
字符類型:rune
字符串:string
錯誤類型:error
同時GO語言也支持下面的復合類型:
指針
數組
切片:slice
集合:map
通道:chan
結構體:struct
接口:interface
上看下看左看右看,怎么沒有看到double類型呢?同時還有幾個陌生的面孔,像rune、error、slice、chan等,呵呵,GO的確沒有提供double類型,它認為浮點類型足夠表達double的范圍,所以就把double取消了;
另外,整型也進行了劃分,像int8、int16、int、uint、uintptr等,其中int8與byte是等價的,可以認為byte是int8的別名,對了,給類型取別名可是GO的特別本事喲~~~
1、按Java習慣先創建workspace目錄,我把這個workspace放到了GOROOT環境變量下,里面分別再創建src、bin、pkg三個目錄
2、打開Sublime text,選擇“File > Open Folder...”
3、在彈出的窗口中選擇workspace目錄
4、在Sublime text中輸入如下代碼
package main
import "fmt"
type intNick int //為int取個intNick別名
func main() {
? ? ?var a intNick
? ? ?fmt.Println(a)
}
5、選擇“File > Save with Encoding > UTF-8”,文件名取為“nick.go”
6、type intNick int表示為int取了一個別名,叫intNick
? var a intNick表示定義一個變量a,它的類型是intNick,缺省值為0
? fmt.Println(a)表示輸出變量a的值
7、按ctrl + b,輸入go run nick.go后回車,可以看到運行結果:輸出0,耗時1.0231298秒
二、為類型增加方法?
在上面的例子其實不僅僅是取一個別名,而是重新定義了一個類型,我們可以為這個全新的類型增加方法
1、在nick.go中增加如下代碼
/**
?* 為intNick類型增加一個isLessThanParam的方法
?*/
func (nick intNick) isLessThanParam(param intNick) bool {
return nick < param
}
2、GO語言的方法定義
func methodname(param1 paramType1, param2 paramType2) (result1 resultType1, result2 resultType2){
? ? //...略
}
其中func是方法修飾符
methodname是方法名
param1、param2是方法入參
paramType1、paramType2是方法入參的參數
result1、result2是返回值
resultType1、resultType2是返回值的類型
【備注】:
GO語言比較有意思的是,它可以返回多個值,這點是程序員一直夢寐以求的,但其它語言所不支持的
在《[3]GO語言常量與變量》中曾經說過:GO語言很符合人的正常思維,代碼想怎么寫就怎么寫,無論怎么寫都符合GO的語法。
2.1 假如param1和param2的類型一樣,都是paramType,那么很自然地可以把方法簡寫為
func methodname(param1,param2 paramType) (result1 resultType1, result2 resultType2){
? ? //...略
}
2.2 假如result1和result2的類型一樣,都是resultType,那么方法還可以簡寫為
func methodname(param1, param2 paramType) (result1, result2 resultType){
? ? //...略
}
2.3 假如參數和返回值只有一個,那么方法可以簡寫為
func methodname(param paramType) (result resultType){
? ? //...略
}
2.4 既然只有一個返回值,直接返回一個返回值的類型就得了,那么方法可以簡寫為
func methodname(param paramType) resultType{
? ? //...略
}
以上表達方式都是正確的,所以GO語言是簡約而不簡單
3、為類型增加的方法與一般方法的區別
在2中介紹了GO語言是怎么定義方法的,那么我們為定義的全新類型增加的方法與一般方法的區別在什么地方呢?
為類型增加方法:
func (nick intNick) isLessThanParam(param intNick) boolean {
? ?return nick < param
}
一般方法:
func methodname(param paramType) resultType{
? ?//...略
}
明眼人一下就看出來了——在方法名前增加了(nick intNick),這表示該方法是用于nick對象的,nick對象的類型為intNick。
所以在main中使用該方法時就可以參照面向對象的方式進行編碼了:
// 定義對象a,對象是intNick類型的對象。這就像有一個Integer類,它的實例是a
var a intNick = 8
// 調用對象a的isLessThanParam()方法
a.isLessThanParam(9)
4、GO到底是面向過程的,還是面向對象的,還是面向函數的?
這是一個很好的話題,在我看來它都有,在51cto的視頻教學中,無聞老師提及到了GO是面向類型的編程,很精辟的一個歸納。
5、修改main方法
func main() {
? ? var a intNick = 8
? ? fmt.Println(a.isLessThanParam(9))
}
6、按ctrl + b,輸入go run nick.go后回車,可以看到運行結果:輸出true
三、題外話
1、盡管byte是int8的別名,但在常規的開發過程中,還是建議不要用int8指定變量的類型,這樣容易導致移植困難
2、GO語言對代碼的排列方式也進行了語法級別的檢查,動手編寫上面的代碼會發現,函數定義時花括號必須在這一行的后面,如果把花括號新起一行,則會出現unexpected semicolon or newline before {錯誤,如下:
func (nick intNick) isLessThanParam(param intNick) bool?
{
? ? return nick < param
}
總結
以上是生活随笔為你收集整理的【Go语言】【4】GO语言类型和为类型增加方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LA 6474 Drop Zone (最
- 下一篇: 2015春节期间读完两本书,立贴为证。