Go語言數據類型、輸入輸出
一、數據類型
Go 語言按類別有以下幾種數據類型:
序號 | 類型和描述 |
---|---|
1 | 布爾型 布爾型的值只可以是常量 true 或者 false。一個簡單的例子:var b bool = true。 |
2 | 數字類型 整型 int 和浮點型 float32、float64,Go 語言支持整型和浮點型數字,並且支持復數,其中位的運算采用補碼。 |
3 | 字符串類型: 字符串就是一串固定長度的字符連接起來的字符序列。Go 的字符串是由單個字節連接起來的。Go 語言的字符串的字節使用 UTF-8 編碼標識 Unicode 文本。 |
4 | 派生類型: 包括:(a) 指針類型(Pointer)(b) 數組類型(c) 結構化類型(struct)(d) Channel 類型(e) 函數類型(f) 切片類型(g) 接口類型(interface)(h) Map 類型 |
GO的數值類型分為以下幾種:整數、浮點數、復數,其中每一種都包含了不同大小的數值類型,例如有符號整數包含 int8、int16、int32、int64 等,每種數值類型都決定了對應的大小范圍和是否支持正負符號。
Go語言同時提供了有符號和無符號的整數類型,其中包括 int8、int16、int32 和 int64 四種大小截然不同的有符號整數類型,分別對應 8、16、32、64 bit(二進制位)大小的有符號整數,與此對應的是 uint8、uint16、uint32 和 uint64 四種無符號整數類型
Go語言省去了short,long,double等類型,直接用類似int16,int64這樣的方式來表示
關於值傳遞和引用傳遞
值傳遞:值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數
引用傳遞:所謂引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。
a、值類型:基本數據類型,int,float,bool,string,以及數組和struct
特點:變量直接存儲值,內存通常在棧中分配,棧在函數調用完會被釋放
b、引用類型:指針,slice,map,chan等都是引用類型
特點:變量存儲的是一個地址,這個地址存儲最終的值。內存通常在堆上分配,通過GC回收。
var x int16=88
y:=9999999
z:=3.22
fmt.Printf("x的類型是%T,值為%v\n",x,x)//格式化輸出,使用fmt.Printf()
fmt.Printf("y的類型是%T,值為%v\n",y,y)
fmt.Printf("z的類型是%T,值為%v\n",z,z)
//x的類型是int16,值為88
//y的類型是int,值為9999999
//z的類型是float64,值為3.22
類型轉換
Go語言中不允許隱式轉換,所有類型轉換必須顯式聲明,而且轉換只能發生在兩種相互兼容的類型之間。
var ch byte = 97
//var a int = ch //err, cannot use ch (type byte) as type int in assignment
var a int = int(ch)
類型別名
type (
myint int //int改名為myint
mystr string //string改名為mystr
)
二、格式化輸出
fmt.Printf()格式字符串:
import "fmt"
fmt包實現了類似C語言printf和scanf的格式化I/O。格式化動作('verb')源自C語言但更簡單。
fmt.Printf("hi %d",1+9)
//hi 10
Printing
verb:
通用:
%v 值的默認格式表示
%+v 類似%v,但輸出結構體時會添加字段名
%#v 值的Go語法表示
%T 值的類型的Go語法表示
%% 百分號
布爾值:
%t 單詞true或false
整數:
%b 表示為二進制
%c 該值對應的unicode碼值
%d 表示為十進制
%o 表示為八進制
%q 該值對應的單引號括起來的go語法字符字面值,必要時會采用安全的轉義表示
%x 表示為十六進制,使用a-f
%X 表示為十六進制,使用A-F
%U 表示為Unicode格式:U+1234,等價於"U+%04X"
浮點數與復數的兩個組分:
%b 無小數部分、二進制指數的科學計數法,如-123456p-78;參見strconv.FormatFloat
%e 科學計數法,如-1234.456e+78
%E 科學計數法,如-1234.456E+78
%f 有小數部分但無指數部分,如123.456
%F 等價於%f
%g 根據實際情況采用%e或%f格式(以獲得更簡潔、准確的輸出)
%G 根據實際情況采用%E或%F格式(以獲得更簡潔、准確的輸出)
字符串和[]byte:
%s 直接輸出字符串或者[]byte
%q 該值對應的雙引號括起來的go語法字符串字面值,必要時會采用安全的轉義表示
%x 每個字節用兩字符十六進制數表示(使用a-f)
%X 每個字節用兩字符十六進制數表示(使用A-F)
指針:
%p 表示為十六進制,並加上前導的0x
沒有%u。整數如果是無符號類型自然輸出也是無符號的。類似的,也沒有必要指定操作數的尺寸(int8,int64)。
寬度通過一個緊跟在百分號后面的十進制數指定,如果未指定寬度,則表示值時除必需之外不作填充。精度通過(可選的)寬度后跟點號后跟的十進制數指定。如果未指定精度,會使用默認精度;如果點號后沒有跟數字,表示精度為0。舉例如下:
%f: 默認寬度,默認精度
%9f 寬度9,默認精度
%.2f 默認寬度,精度2
%9.2f 寬度9,精度2
%9.f 寬度9,精度0
輸入輸出
本篇涉及函數的知識,不過沒有影響
本篇涉及函數的知識,不過沒有影響
package fmt
fmt包實現了類似C語言printf和scanf的格式化I/O。格式化動作('verb')源自C語言但更簡單。
fmt.Println函數我們知道是打印換行的函數。
文檔中是這樣的:
func Println(a ...interface{}) (n int, err error)
a ...interface{}的意思是接受任意類型的參數, (n int, err error)代表這個函數返回的參數
一、輸出
標准輸出
常用的標准輸出函數有以下三種,都會將數據輸出到標准設備,如屏幕。
都是以P開頭的函數,用法基本相同。
值得一提的是go語言通過大小寫來決定公開程度,如大寫字母開頭即代表public
fmt.Println()//輸出任意類型數據,並換行
fmt.Print() //輸出任意類型數據,不換行
fmt.Printf()//格式化輸出數據,不換行
如下:
fmt.Println("我是fmt.Println()輸出的數據,我換行啦")
fmt.Print("我是fmt.Print()輸出的數據,我不換行")
fmt.Printf("我是 fmt.Printf()輸出的數據,格式化輸出不換行。。。%s","ha")
我是fmt.Println()輸出的數據,我換行啦
我是fmt.Print()輸出的數據,我不換行我是 fmt.Printf()輸出的數據,格式化輸出不換行。。。ha
當然fmt.Print()這些不換行你可以通過轉義字符來控制換行,如\n等
非標准輸出
也有其他輸出,比如Fprintf等,這我們將在后面接觸。
Fprintf根據format參數生成格式化的字符串並寫入w。返回寫入的字節數和遇到的任何錯誤。
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
二、輸入
標准輸入
fmt.Scan()//掃描,必須所有參數都被填充后換行才結束掃描
fmt.Scanln()//掃描,但是遇到換行就結束掃描
fmt.Scanf()//格式化掃描,換行就結束
??注意以上都是需要使用地址來取得掃描到的數據哈
如fmt.Scan(&x,&y)
分別演示一下
Scan
func main() {
var(
x,y string
)
fmt.Println("輸入兩個字符串:")
fmt.Scan(&x,&y)
fmt.Println("x :"+x)
fmt.Println(" y:"+y)
}
結果如下,必須接受兩個值才可以結束。輸入一個值換行不會結束。
輸入兩個字符串:
he
ok
x :he
y:ok
Scanln
func main() {
var(
x,y string
z string
)
fmt.Println("輸入三個字符串:")
fmt.Scanln(&x,&y,&z)
fmt.Println("x :"+x)
fmt.Println(" y:"+y)
fmt.Println("z:"+z)
}
只要換行就結束
輸入三個字符串:
ha yes lala
x :ha
y:yes
z:lala
//只輸入一個字符串也結束
輸入三個字符串:
eee
x :eee
y:
z:
Scanf
func main() {
var(
x,y string
z string
)
fmt.Println("輸入三個字符串:")
fmt.Scanf("%s %s %s",&x,&y,&z)
fmt.Println("x :"+x)
fmt.Println(" y:"+y)
fmt.Println("z:"+z)
}
格式化輸入,只要換行就結束
輸入三個字符串:
ha la hou
x :ha
y:la
z:hou
//只輸入一個字符串也結束
輸入三個字符串:
eee
x :eee
y:
z:
非標准輸入
如 Fscanf等
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
Fscanf從r掃描文本,根據format 參數指定的格式將成功讀取的空白分隔的值保存進成功傳遞給本函數的參數。返回成功掃描的條目個數和遇到的任何錯誤。
輸入輸出流
以上標准輸入都是fmt包下的,fmt包比較方便
當然也可以通過輸入流解決,如下輸入:
func main() {
inputReader := bufio.NewReader(os.Stdin) // 使用了自動類型推導,不需要var關鍵字聲明
//inputReader = bufio.NewReader(os.Stdin)
fmt.Println("Please input your name: ")
//input, err = inputReader.ReadString('\n')
input, err := inputReader.ReadString('\n')
if err == nil {
fmt.Printf("Your name is: %s\n", input)
}
}
這是輸入輸出流,在處理復雜數據流的時候很給力,處理簡單文本數據就顯得比較繁瑣了,所以fmt包就是簡化版的輸入輸出,對我們常用的的數據處理進行的封裝。