func getVal(num1 int, num2 int) (int, int) {
sum := num1 + mum2
sub := num1 - num2
return sum, sub
}
func main() {
sum, sub := getVal(30, 30)
fmt.Println("sum=", sum, "sub=", sub)
sum2, _ := getVal(10, 30)
fmt.Println("sum=", sum2)
}
package main
import "fmt"
func main() {
//定義變量
var i int
//給i賦值
i = 10
//使用變量
fmt.Println("i=",i)
}
D:\goproject\src\go_code\chapter02\demon01>go run main.go
i= 10
package main
import "fmt"
func main() {
//golang的變量使用方式
//第一種:指定變量類型,定義后若不賦值,使用默認值
//init的默認值是0
var i int
fmt.Println("i=", i)
}
D:\goproject\src\go_code\chapter02\demon02>go run main.go
i= 0
2)第二種,根據(jù)值自行判斷變量類型(類型引導)
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、樂都網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、成都h5網(wǎng)站建設、商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為樂都等各大城市提供網(wǎng)站開發(fā)制作服務。
package main
import "fmt"
func main() {
//第二種:根據(jù)值自行判斷變量類型(類型推導)
var num = 10.11
fmt.Println("num=", num)
}
D:\goproject\src\go_code\chapter02\demon02>go run main.go
num= 10.11
3)第三種,省略var定義變量并賦值
package main
import "fmt"
func main() {
//第三種:省略var,:= 的:不能省略,否則報錯
//下面的方式等價于 var name string name = "tom"
name := "tom"
fmt.Println("name=", name)
}
D:\goproject\src\go_code\chapter02\demon02>go run main.go
name= tom
多變量定義
1)在編程中,有時我們需要一次性定義多個變量,Golang也提供了這樣的語法【在函數(shù)里面定義】
package main
import "fmt"
func main() {
//該案例演示Golang如何一次性定義多個變量
var a1, a2, a3 int
fmt.Println("a1=", a1, "a2=", a2, "a3=", a3)
//一次性定義多個變量的方式二
var b1, b2, b3 = 100, "tom", 888
fmt.Println("b1=", b1,"b2=", b2,"b3=", b3)
//一次性定義多個變量的方式三,同樣可以使用類型推導
c1, name, c3 := 200, "mary", 999
fmt.Println("c1=", c1,"name=", name,"c3=", c3)
}
D:\goproject\src\go_code\chapter02\demon03>go run main.go
a1= 0 a2= 0 a3= 0
b1= 100 b2= tom b3= 888
c1= 200 name= mary c3= 999
2)一次性定義全局變量【在go中函數(shù)外部定義變量就是全局變量】
package main
import "fmt"
//定義全局變量
var n1 = 100
var n2 = 200
var name = "jack"
//上面的定義方式,也可以改成一次性定義
var (
n3 = 300
n4 = 400
name2 = "zhangsan"
)
func main() {
fmt.Println("n1=", n1,"n2=", n2,"name=", name)
fmt.Println("n3=", n3,"n4=", n4,"name2=", name2)
}
D:\goproject\src\go_code\chapter02\demon03>go run var.go
n1= 100 n2= 200 name= jack
n3= 300 n4= 400 name2= zhangsan
package main
import "fmt"
func main() {
//該區(qū)域的數(shù)據(jù)值可以在同一類型范圍內不斷變化
var i int = 10
i = 30
i = 50
fmt.Println("i=", i)
}
D:\goproject\src\go_code\chapter02\demon03>go run var02.go
i= 50
程序中+號的使用
1)當左右兩邊都是數(shù)值型時,則做加法運算;
2)當左右兩邊都是字符串時,則做字符串拼接;
package main
import "fmt"
//演示golang中+號的使用
func main() {
var i = 1
var j = 2
var r = i + j //做加法運算
fmt.Println("r=", r)
var str1 = "hello"
var str2 = "world"
var res = str1 + str2 //做拼接操作
fmt.Println("res=", res)
}
D:\goproject\src\go_code\chapter02\demon04>go run main.go
r= 3
res= helloworld
每一種數(shù)據(jù)都定義了明確的數(shù)據(jù)類型,在內存中分配了不同大小的內存空間。
package main
import(
"fmt"
)
func main() {
var n1 = 100
//%T表示內容的數(shù)據(jù)類型
fmt.Printf("n1 的類型是 %T\n", n1)
}
D:\gocode\goproject02\main01>go run main.go
n1 的類型是 int
3)如何在程序查看某個變量的字節(jié)大小和數(shù)據(jù)類型
package main
import(
"fmt"
"unsafe" //前提引入unsafe函數(shù)
)
func main() {
var n1 = 100
//%T表示內容的數(shù)據(jù)類型
fmt.Printf("n1 的類型是 %T\n", n1)
//如何在程序查看某個變量的占用字節(jié)大小和數(shù)據(jù)類型
var n2 int64 = 10
//unsafe.Sizeof(n2) 是unsafe包的一個函數(shù),可以返回n2變量占用的字節(jié)數(shù)
fmt.Printf("n2 的數(shù)據(jù)類型是 %T\nn2占用的字節(jié)大小是 %d", n2, unsafe.Sizeof(n2))
}
D:\gocode\goproject02\main01>go run main.go
n1 的類型是 int
n2 的數(shù)據(jù)類型是 int64
n2占用的字節(jié)大小是 8
4)Golang程序中整型變量在使用時,遵守保小不保大的原則,即:在保證程序正確運行下,盡量使用占用空間小的數(shù)據(jù)類型。
5)bit:計算機中的最小存儲單位;byte:計算機中基本存儲單元;1byte=8bit
package main
import(
"fmt"
)
//演示golang中小數(shù)類型使用
func main() {
var price float32 = 87.23
fmt.Println("price", price)
}
D:\gocode\goproject02\main02>go run main.go
price 87.23
var num3 float32 = -123.00000901
var num4 float64 = -123.00000901
fmt.Println("num3=", num3,"num4=", num4)
D:\goproject\src\go_code\chapter02\floatdemo06>go run main.go
num3= -123.00001 num4= -123.00000901
說明:float64 的精度比float32 的要準確。
//Golang的浮點類型默認聲明為float64類型
var a = 1.1
fmt.Printf("a的數(shù)據(jù)類型為 %T \n", a)
D:\goproject\src\go_code\chapter02\floatdemo06>go run main03.go
a的數(shù)據(jù)類型為 float64
3)浮點型常量有兩種表示形式;
① 十進制數(shù)形式:如 5.12 .512(必須有小數(shù)點)
//十進制數(shù)形式
b := 5.12
c := .123
fmt.Println("b=", b, "c=", c)
D:\goproject\src\go_code\chapter02\floatdemo06>go run main03.go
b= 5.12 c= 0.123
② 科學計數(shù)法形式:如 5.1234e2 ==== 5.12 * 10的2次方; 5.12E-2 ==== 5.12/10的2次方
//科學計數(shù)法形式
d := 5.1234e2 // 5.1234 * 10的2次方
e := 5.1234E2 // 5.1234 * 10的2次方
f := 5.1234E-2 // 5.1234 / 10的2次方
fmt.Println("d=", d, "e=", e, "f=",f)
D:\goproject\src\go_code\chapter02\floatdemo06>go run main03.go
d= 512.34 e= 512.34 f= 0.051234
4)Golang浮點型只有這兩種類型,float32 和 float64,float64 比 float32 更精確。
案例演示
package main
import(
"fmt"
)
//演示golang中字符類型使用
func main() {
var c1 byte = 'a'
var c2 byte = '0' //字符的0
//當直接輸出byte值,就是輸出了對應字符的碼值
fmt.Println("c1=", c1)
fmt.Println("c2=", c2)
//如果希望輸出對應字符,需要格式化輸出
fmt.Printf("c1=%c c2=%c\n", c1, c2)
//如果輸出的碼值高于byte(0-255)的范圍,輸出就會溢出,可以用int
var c3 int = '北'
fmt.Printf("c3=%c c3對應碼值=%d", c3, c3)
}
D:\goproject\src\go_code\chapter02\chardemon07>go run main.go
c1= 97
c2= 48
c1=a c2=0
c3=北 c3對應碼值=21271
對上面代碼說明:
1)如果保存的字符在ASCII表,比如【0-1,a-z,A-Z...】直接可以保存到byte;
2)如果保存的字符對應碼值大于255,這時可以考慮使用int類型保存;比如中文;
3)如果需要按照字符的方式輸出,這時需要格式化輸出,即 fmt.Printf("%c", c1)。
//可以直接給某個變量賦一個數(shù)字,然后按格式化輸出時%c,會輸出該數(shù)字對應的unicode字符;
var c4 int = 22269 //22269 -> '國'
fmt.Printf("c4=%c\n", c4)
D:\goproject\src\go_code\chapter02\chardemon07>go run main.go
c4=國
6)字符類型是可以進行運算的,相當于一個整數(shù),因為它都有對應的Unicode碼;
//字符類型是可以進行運算的,相當于一個整數(shù),運算時按照碼值運行;
var n1 = 10 + 'a' // 相當于 10 + 97 = 107
fmt.Println("n1=", n1)
D:\goproject\src\go_code\chapter02\chardemon07>go run main.go
n1= 107
package main
import(
"fmt"
"unsafe"
)
//演示golang中bool類型使用
func main() {
var b = false
fmt.Println("b=", b)
//注意事項
//1. bool類型占用存儲空間為1個字節(jié)
fmt.Println("b 的占用字節(jié) =", unsafe.Sizeof(b))
//2. bool類型只能取true或者false
}
D:\goproject\src\go_code\chapter02\booldemo08>go run main.go
b= false
b 的占用字節(jié) = 1
//演示golang中string類型使用
func main() {
//string的基本使用
var address string = "北京長城 112 helloworld!"
fmt.Println(address)
}
D:\goproject\src\go_code\chapter02\stringdemo09>go run main.go
北京長城 112 helloworld!
//使用雙引號,支持轉義字符
str1 := "abc\nbcd"
fmt.Println(str1)
D:\goproject\src\go_code\chapter02\stringdemo09>go run main.go
abc
bcd
②反引號,以字符串的原生形式輸出,包括換行和特殊字符,可以輸出源代碼等效果。
//使用反引號,以字符串的原生形式輸出,適用于輸出源碼
str2 := `
package main
import(
"fmt"
)
`
fmt.Println(str2)
D:\goproject\src\go_code\chapter02\stringdemo09>go run main.go
package main
import(
"fmt"
)
3)字符串拼接方式
//字符串拼接方式
var str3 = "hello" + "world!"
fmt.Println(str3)
D:\goproject\src\go_code\chapter02\stringdemo09>go run main.go
helloworld!
4)當拼接字符串太長時,需要使用到多行字符串,可以如下處理【注意,將+號留在上一行】
//當拼接的字符串很長時,可以分行寫,注意將+保留在上一行
var str4 = "hello" + "world!" + "world!" + "world!" +
"hello" + "world!" + "world!" + "world!" + "hello" +
"world!" + "world!" + "world!" + "hello" + "world!" +
"world!" + "world!"
fmt.Println(str4)
D:\goproject\src\go_code\chapter02\stringdemo09>go run main.go
helloworld!world!world!helloworld!world!world!helloworld!world!world!helloworld!
world!world!
package main
import(
"fmt"
)
//基本數(shù)據(jù)類型的默認值
func main() {
var a int // =0
var b float32 // =0
var c float64 // =0
var d bool // false
var name string // ""
//這里的%v 表示按照變量的值輸出
fmt.Printf("a=%d,b=%v,c=%v,d=%v,name=%v", a,b,c,d,name)
}
D:\goproject\src\go_code\chapter02\defaultdemo10>go run main.go
a=0,b=0,c=0,d=false,name=
package main
import(
"fmt"
)
//演示golang中基本數(shù)據(jù)類型的轉換
func main() {
var i int32 = 100
//將 i => float32
var n1 float32 = float32(i)
//低精度 => 高精度
var n2 int64 = int64(i)
fmt.Printf("i=%v n1=%v n2=%v", i,n1,n2)
}
D:\goproject\src\go_code\chapter02\transtype11>go run main.go
i=100 n1=100 n2=100
package main
import(
"fmt"
)
//演示golang中基本數(shù)據(jù)類型的轉換
func main() {
var i int32 = 100
//將 i => float32
var n1 float32 = float32(i)
//低精度 => 高精度
var n2 int64 = int64(i)
fmt.Printf("i=%v n1=%v n2=%v\n", i,n1,n2)
//被轉換的是變量存儲的數(shù)據(jù)(即值),變量本身的數(shù)據(jù)類型并沒有變化?。?!
fmt.Printf("i type is %T", i)
}
D:\goproject\src\go_code\chapter02\transtype11>go run main.go
i=100 n1=100 n2=100
i type is int32
3)在轉換中,比如將 int64 轉換成 int8(-128----127),編譯時不會出錯,只是轉換的結果是按溢出處理,和我們希望的結果不一樣,因此在轉換時,需要考慮范圍。
//在轉換中,比如將 int64 轉換成 int8(-128----127),編譯時不會出錯;
//只是轉換的結果是按溢出處理,和我們希望的結果不一樣;因此在轉換時,需要考慮范圍。
var num1 int64 = 999999
var num2 int8 = int8(num1)
fmt.Println("num2=", num2)
D:\goproject\src\go_code\chapter02\transtype11>go run main.go
num2= 63
課堂練習
1)以下代碼編譯不能通過和解決方案
package main
import(
"fmt"
)
func main() {
var n1 int32 = 12
var n2 int64
var n3 int8
//不能編譯通過,因為沒有進行數(shù)據(jù)類型轉換
n2 = n1 + 20 //int32 ----> int64 錯誤
n3 = n1 + 20 //int32 ----> int8 錯誤
//以下是解決方案
n2 = int64(n1) + 20
n3 = int8(n1) + 20
fmt.Println("n2=", n2, "n3=", n3)
}
2)如果相加的值大于本身的數(shù)據(jù)類型范圍,則編譯不通過
func main() {
//如果相加的值大于本身的數(shù)據(jù)類型范圍,則編譯不通過
var n4 int32 = 12
var n5 int8
var n6 int8
n5 = int8(n4) + 127 //【編譯通過,但是結果按溢出處理】
n6 = int8(n4) + 128 //【編譯不通過,因為128超出int8數(shù)據(jù)類型的范圍】
fmt.Println("n5=", n5)
}
基本數(shù)據(jù)類型轉換string類型
1)方式一:fmt.Sprintf("%參數(shù)", 表達式)
函數(shù)介紹:
func Sprintf
func Sprintf(format string, a ...interface{}) string
Sprintf根據(jù)format參數(shù)生成格式化的字符串并返回該字符串。
參數(shù)需要和表達式的數(shù)據(jù)類型相匹配;fmt.Sprintf().. 會返回轉換后的字符串。
案例演示:
package main
import(
"fmt"
)
//演示golang中基本數(shù)據(jù)類型轉換string類型
func main() {
var num1 int = 99
var num2 float64 = 23.456
var b bool = true
var myChar byte = 'h'
var str string //空的string
//使用第一種方式 fmt.Sprintf 來轉換
str = fmt.Sprintf("%d", num1)
fmt.Printf("str type %T; str=%q\n", str, str)
str = fmt.Sprintf("%f", num2)
fmt.Printf("str type %T; str=%q\n", str, str)
str = fmt.Sprintf("%t", b)
fmt.Printf("str type %T; str=%q\n", str, str)
str = fmt.Sprintf("%c", myChar)
fmt.Printf("str type %T; str=%q", str, str)
}
D:\goproject\src\go_code\chapter02\basictype2string12>go run main.go
str type string; str="99"
str type string; str="23.456000"
str type string; str="true"
str type string; str="h"
2)方式二:使用strconv包的函數(shù)
函數(shù)介紹:
func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
案例說明:
package main
import(
"fmt"
"strconv"
)
func main() {
//使用第二種方式 strconv 函數(shù)來轉換
var num3 int = 99
var num4 float64 = 23.456
var b2 bool = true
str = strconv.FormatInt(int64(num3), 10)
fmt.Printf("str type %T; str=%q\n", str, str)
//說明:'f'格式;10:表示小數(shù)位保留10位;64:表示這個小數(shù)是float64;
str = strconv.FormatFloat(num4, 'f', 10, 64)
fmt.Printf("str type %T; str=%q\n", str, str)
str = strconv.FormatBool(b2)
fmt.Printf("str type %T; str=%q", str, str)
//strconv包中有一個函數(shù) Itoa,可以將int類型轉換成string;
var num5 int = 3456
str = strconv.Itoa(num5)
fmt.Printf("str type %T; str=%q", str, str)
}
D:\goproject\src\go_code\chapter02\basictype2string12>go run main.go
str type string; str="99"
str type string; str="23.4560000000"
str type string; str="true"
str type string; str="3456"
string類型轉換基本數(shù)據(jù)類型
使用strconv包的函數(shù),函數(shù)介紹:
func ParseBool(str string) (value bool, err error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
案例演示:
package main
import(
"fmt"
"strconv"
)
//演示golang中string類型轉換基本數(shù)據(jù)類型
func main(){
var str string = "true"
var a bool
//strconv.ParseBool(str) 函數(shù)會返回兩個值(value bool,err error)
//因為只想獲取到value bool,使用_忽略第二個值;
a, _ = strconv.ParseBool(str)
fmt.Printf("a type %T; a=%v\n", a, a)
var str2 string = "1234566"
var b int64
b, _ = strconv.ParseInt(str2, 10, 64)
fmt.Printf("b type %T; b=%v\n", b, b)
var str3 string = "124.324"
var c float64
c, _ = strconv.ParseFloat(str3, 64)
fmt.Printf("c type %T; c=%v", c, c)
}
D:\goproject\src\go_code\chapter02\string2basictype13>go run main.go
a type bool; a=true
b type int64; b=1234566
c type float64; c=124.324
說明一下,由于strconv函數(shù)返回的是int64或float64,如果希望得到int32,float64等,如下處理:
var d int64
d = int32(d)
基本介紹
1)基本數(shù)據(jù)類型,變量存的就是值,也叫值類型;變量存值都對應一個地址。
2)獲取變量的地址,用 &,比如:var num int,獲取num的地址:&num
分析一下基本數(shù)據(jù)類型在內存的布局:
3)指針類型,指針變量存的是一個地址,這個地址指向的空間存的才是值。比如:var ptr int = &num
舉例說明:指針在內存中的布局
4)獲取指針類型所指向的值,使用星號,*ptr
package main
import(
"fmt"
)
//演示golang中指針類型
func main() {
//基本數(shù)據(jù)類型在內存布局
var i int = 10
//i的地址是什么,&i
fmt.Println("i的地址=", &i)
//ptr是一個指針變量;ptr的類型是*int;
//ptr本身的值為&i(變量i對應的地址);
var ptr *int = &i
fmt.Printf("ptr=%v\n", ptr)
fmt.Printf("ptr的地址=%v\n", &ptr)
//獲取指針類型所指向的值,使用 *
fmt.Printf("ptr指向的值=%v", *ptr)
}
D:\gocode\goproject02\pointerdemo>go run main.go
i的地址= 0xc042050058
ptr=0xc042050058
ptr的地址=0xc04206e020
ptr指向的值=10
案例演示
1)寫一個程序,獲取一個int變量num的地址,并顯示到終端;
2)將num的地址賦給指針ptr,并通過ptr去修改num的值。
package main
import(
"fmt"
)
func main() {
var num int = 100
fmt.Println("num的地址=", &num)
var ptr *int = &num
fmt.Printf("ptr=%v\n", ptr)
*ptr = 200
fmt.Println("num=", num)
}
D:\gocode\goproject02\pointerdemo>go run main02.go
num的地址= 0xc042050058
ptr=0xc042050058
num= 200
分享名稱:(二)Golang的變量
新聞來源:http://muchs.cn/article48/jiodhp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、移動網(wǎng)站建設、網(wǎng)站設計公司、面包屑導航、做網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)