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