指針,以及標識符
1.指針
(1).基本介紹
1)基本數(shù)據(jù)類型,變量存的值,也叫值類型
2)獲取變量的地址用&,比如 var num int ,獲取num的地址:&num
3)指針類型,變量存的是一個地址,這個地址指向的空間存的才是真正值,比如: var ptr *int =&num
4)獲取指針類型所指的值,使用*,比如:var *ptr int,使用 *ptr獲取p指向的值
5)舉例說明
package main
import(
"fmt"
)
//演示golang中的指針類型
func main(){
//基本數(shù)據(jù)在內(nèi)存的布局
var i int = 10
// i的地址是多少 &i
fmt.Println("i的地址=",&i) //結(jié)果為:i的地址= 0xc04205e058
//1.a是一個指針變量
//2. a的類型是 *int
//3.a 本身就是 &i
var a *int =&i
fmt.Println("i的值是",i) //10
fmt.Println("a存放的值是",a)//0xc04205e058
fmt.Println("a指向的值是",*a)//10
fmt.Println("指針本身的地址是",&a)//0xc04207c020
或者可以使用printf()進行格式化輸出
}
內(nèi)存布局圖:
關(guān)于指針的內(nèi)存布局操作
練習(xí),通過指針修改所存變量地址中存放的值
package main
import(
"fmt"
)
func main(){
var a int =999
fmt.Println("a的地址是",&a)
fmt.Println("指針修改之前a的值是",a)
var prt *int = &a
fmt.Println("prt的值是",*prt)
*prt = 23 //通過指針去修改a變量的值
fmt.Println("prt的值是",*prt)
fmt.Println("通過指針修改后這個a的值是",a)
}
判斷對錯
func main(){
var a int = 300
var ptr *int =a //錯誤應(yīng)該是 &a
}
func main(){
var a int = 300
var prt *float32 = &a //錯誤,類型不一致,不應(yīng)該是float
}
func main(){
var a int =300
var b int =400
var ptr *int =&a
*ptr = 100 //a=100
ptr = &b //存放b的地址
*ptr = 200 //b=200
fmt.Printf("a=%d, b=%d,*ptr=%d",a,b,*ptr)
}
(2)指針的細節(jié)說明
1)值類型,都有對應(yīng)的指針類型,形式為:“數(shù)據(jù)類型”,比如int 的對應(yīng)的指針就是 * int,而float32對應(yīng)的指針類型就是 *float32 ,以此類推
2)值類型:基本數(shù)據(jù)類型int系列,float系列,bool string \數(shù)組和結(jié)構(gòu)體struct
2.值類型和引用類型
(1)說明:
1)值類型:基本數(shù)據(jù)類型int系列,float系列,bootl,string、數(shù)組和結(jié)構(gòu)體struct
2)引用類型:指針,slice切片、map、管道chan,interface等都是引用類型
(2)值類型和引用類型的區(qū)別
1)值類型:變量直接存儲,內(nèi)存通常在棧中分配
2)引用類型:變量存儲的是一個地址,這個地址對應(yīng)的空間才真正存儲數(shù)據(jù)(值),內(nèi)存通常在堆中分配,當(dāng)沒有任何變量引用這個地址時,該地址對應(yīng)的數(shù)據(jù)空間就成為一個垃圾由GC來回收
3.標識符的命名規(guī)范
(1).標識符概念
1)golang對各種變量、方法等命名時使用的字符序列稱為標識符
2)凡是自己可以起名字的地方都叫標識符
(2).標識符的命名規(guī)則(6點)
1)由26個英文字母大小寫,0~9,下劃線—組成
2)數(shù)字不可以開頭
3)Golang中嚴格區(qū)分大小寫
4)標識符不能包含空格
5)下劃線"—"本身在go中是一個特殊字符,稱為空標識符,可以代表任何其他的標識符,但是它對應(yīng)的值會忽略(比如,忽略某個返回值),所以僅能被作為占位符使用不能作為標識符使用
6)不能以系統(tǒng)保留關(guān)鍵字作為標識符,比如break、if等等…
package main
import "fmt"
//演示golang中標識符的使用
func main() {
//嚴格區(qū)分大小寫
var num int = 10
var Num int = 20
fmt.Printf("num=%v,Num=%v",num,Num) //10 20
//標識符中不能含有空格
// var ab c int = 30 //會報錯
//_是空標識符,用于占用
// var _ int =40 // erro
}
(3)go中的保留字
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Cm24KPYQ-1693040914579)(D:\myfile\后端\go語言學(xué)習(xí)\pic\關(guān)鍵字.jpg)]
標識符的案例
hello //OK
hello12 //OK
1hello //erro 不能以數(shù)字開頭
h-b //erro 不能使用-
x h //erro 不能有空格
h_4 //ok
_ab //ok
int //ok 不推薦,甚至不要去用,語法通過不推薦使用
var int int =10
fmt.Println("int的值",int)//10success
float32 //ok
_ //erro
Abc //ok
(4)標識符命名注意事項
1)包名:保持package的名字和目錄保持一致,盡量采取有意義的包名,簡短,有意義不要和標準庫沖突
2)變量名、函數(shù)名、常量名,采用駝峰法
var stuName string ="Tom"
var goodPrice int32 =124//第一個單詞字母小寫往后的單詞采用大寫的形式
3)如果使用變量名、函數(shù)名、常量名首字母大寫,則可以被其他的包訪問;如果首字母小寫,則只能在本包中使用(可以簡單理解成,首字母大寫是公有的,首字母小寫是私有的)
預(yù)定標識符
保留關(guān)鍵字的介紹:
(5)運算符:
運算符是一種特殊的符號,用以表示數(shù)據(jù)的運算,賦值和比較等
1)算術(shù)運算符
主要是對數(shù)值型的變量進行運算,比如加減乘除,在Go程序中使用最多
package main
import(
"fmt"
)
func main() {
//重點講解 /,%
//如果參與運算的數(shù)都是整數(shù),那么除后,去掉小數(shù)部分,保留整數(shù)部分。不會四舍五入
fmt.Println(10/4) //是2不是2.5
var n1 float32 = 10 /4 //?結(jié)果也是2
fmt.Println(n1)
//如果我們需要保留小數(shù)部分,則需要有浮點數(shù)參與運算
var n2 float32 = 10.0 /4
fmt.Println(n2) //2.5
}
//演示%的用法
//演示 % 的使用
//看一個公式 a%b=a - (a/b) *b
fmt.Println("10%3=",10 % 3) //結(jié)果余數(shù)是1
fmt.Println("-10%3=",-10 % 3) //結(jié)果余數(shù)是-1 : -10 - [(-10)/3]*3 =-10 -(-9)=-1
fmt.Println("10%-3=",10 % -3) //結(jié)果余數(shù)是 1
fmt.Println("-10%-3=",-10 % -3) //結(jié)果余數(shù)是 -1
//演示 ++ --
var i int = 10
i++ //等價 i = i+1
fmt. Println("i的值是",i) //11
i-- //等價i = i -1
fmt. Println("i的值是",i) //10
(6)細節(jié)說明:
1)對于除號 ”/“,他的整數(shù)和小數(shù)除是有區(qū)別的,整數(shù)之間做除法時,只保留整數(shù)部分而舍棄小數(shù)部分,例如 x := 19/5 結(jié)果是3
2)當(dāng)對一個數(shù)取模式時,可以等價 a%b =a- a/b *b,這樣我們就可以看到取模的本質(zhì)運算
3)Golang的自增自減只能作為一個獨立語言時,不能這樣使用 b :=a++或者b :=a–
4)Golang的++和–只能寫在變量的后面,不能寫在變量的前面,既:a++ a–沒有++a 或者–a
5)Golang的設(shè)計者去掉c/java中的自增自減的容易混淆的寫法讓Golang的語法更加簡潔統(tǒng)一
練習(xí):
(1)假如還有97天放假 問 xx個星期零xx天
(2)定義一個變量保存華氏溫度,華氏溫度轉(zhuǎn)換為攝氏溫度的公式是:5/9*(華氏溫度-100)求出華氏溫度對應(yīng)的攝氏溫度
package main
import (
"fmt"
)
func main(){
//題1
var day int =97
var week int = day/7
var mo int = day%7
fmt.Printf("還有%d天放假,是%d個星期%d天",day,week,mo)
var huashi float32 = 134.2
var sheshi float32 = 5.0 / 9 * (huashi - 100)
fmt.Printf("%v對應(yīng)的攝氏溫度=%v",huashi,sheshi) 19
}
2)賦值運算符
介紹
賦值運算符就是將某個運算后的值,賦給指定的變量
賦值運算符的分類:
案例演示
(1)賦值基本案例
(2)有兩個變量,a和b ,要求將其交換,最終打印結(jié)果
(3)+=的使用案例
package main
import (
"fmt"
)
func main() {
//賦值運算符的使用演示
// var i int
// i = 10 //基本賦值
//有兩個變量,a和b要求將其進行交換,最終打印結(jié)果
//a =9 b=2 ==>a =2 b =9
a := 9
b := 2
//定義一個臨時變量
t :=a
a =b
b =t
fmt.Printf("交換后的情況如下 a=%v,b=%v",a,b)
//復(fù)和賦值的操作
a +=7 //等價 a = a+7
fmt.Println("a+=7的值為",a)
}
賦值運算符的特點
(1)運算順序從右往左
(2)賦值運算符的左邊只能是變量 ,右邊 可以是變量、表達式、常量值
(3)復(fù)合運算符等價于下面的效果
a+=3 a=a+3
3)比較運算符/關(guān)系運算符
(1)關(guān)系運算符的結(jié)果都是bool型,也就是要么為true,要么為false
(2)關(guān)系表達式經(jīng)常用字在if結(jié)構(gòu)中或者循環(huán)條件中
關(guān)系運算符一覽表
細節(jié)說明
- 關(guān)系運算符的結(jié)果都是bool型,也就是要么為true,要么為false
- 關(guān)系運算符組成的表達式,我們稱為關(guān)系表達式 a>b
- 比較運算符”==“不能寫成 “=”
面試題
package main
import(
"fmt"
)
func main(){
//有兩個變量a和b,要求將其進行交換,但是不允許使用中間變量,最終打印效果
var a int = 10
var b int = 20
a = a + b //30
b = a - b // 10
a = a -b //30-10 =20
fmt.Printf("a=%v和b=%v",a,b) //20 和 10
}
4)邏輯運算符
介紹
用于連接多個條件(一般來講就是關(guān)系表達式),最終的結(jié)果也是一個bool值
邏輯運算一覽表:
案例演示
package main
import (
"fmt"
)
func main() {
//演示如何使用邏輯運算符
var age int =40
if age > 30 && age < 50{
fmt.Println("ok1")
}
if age > 30 && age < 40{
fmt.Println("ok2")
}
//演示邏輯或的使用 ||
if age > 30 || age < 50{
fmt.Println("ok3")
}
if age > 30 || age < 40{
fmt.Println("ok4")
}
//演示邏輯非的使用 !
if !(age > 30) {
fmt.Println("ok5") //不輸出
}
}
注意事項和使用細節(jié)
- &&也叫短路與,如果第一個條件為false,則第二個條件不會判斷,最終結(jié)果為false
- ||也叫短路或,如果第一個條件為true,則第二個條件不會判斷,最終結(jié)果為true
案例演示:
//聲明一個測試函數(shù)(測試)
func test() bool {
fmt.Println("test....")
return true
}
func main() {
var i int = 10
//短路與的
//說明:i<9 這個為false 第二條件根本不會去判斷不會調(diào)用test函數(shù)
if i < 9 && test(){
fmt.Println("ok")
}
//短路或
//說明:i>9 這個為true 第二條件根本不會去判斷不會調(diào)用test函數(shù)
if i > 9 || test(){
fmt.Println("ok")
}
運算符的優(yōu)先級
(1)運算符有著不同的優(yōu)先級,所謂優(yōu)先級就是表達式運算中的運算順序,如下表,上一行運算符總優(yōu)先于下一行
(2)只有單目運算符、賦值運算符是從右往左運算的
(3)大致的順序整理
- 括號,++.–
- 單目運算
- 算術(shù)運算符
- 移位運算
- 關(guān)系運算
- 位運算
- 邏輯運算符
- 賦值運算符
- 逗號
6)其他運算符
位運算符
課堂練習(xí)
(1)兩個數(shù)的最大值
(2)求三個數(shù)的最大值
func main() {
//求兩個數(shù)的最大值
var n1 int =10
var n2 int =40
var max int
if n1 > n2{
max =n1
}else{
max =n2
}
fmt.Println("兩個數(shù)的最大值為:",max)
//求出三個數(shù)的最大值
//先求出兩個數(shù)的最大值然后讓第三個數(shù)取比較
var n3 int =45
if n3 > max {
max =n3
}
fmt.Println("三個數(shù)中的最大值是=",max)
}
鍵盤輸入語句
介紹
在編程中,需要接收用戶輸入的數(shù)據(jù),就可以使用鍵盤輸入語句來獲取’
步驟:
1)導(dǎo)入fmt包
2)調(diào)用fmt包的fmt.Scanln()或者fmt.Scanf()
案例演示:
要求:可以從控制臺上接受用戶信息。[姓名,年齡,薪水,是否通過考試]
1)使用fmt.Scanln()獲取
fmt.Println("請輸入姓名")
//當(dāng)程序執(zhí)行到fmt.Scanln(name)是,程序會停止運行,并等待用戶的輸入
fmt.Scanln(&name)
fmt.Println("請輸入年齡")
fmt.Scanln(&age)
fmt.Println("請輸入薪水")
fmt.Scanln(&sal)
fmt.Println("是否通過考試")
fmt.Scanln(&isPass)
fmt.Printf("名字是%v \n 年齡是%v \n 薪水是 %v \n 是否通過考試 %v ",name,age,sal,isPass)
2)使用fmt.Scanf()獲取
/方式2.一次性輸入這些信息 fmt.Scanf()可以按指定的格式輸入信息
fmt.Println("姓名,年齡,薪水,是否通過考試,輸入時采用空格隔開")
fmt.Scanf("%s %d %f %t ",&name,&age,&sal,&isPass)
fmt.Printf("名字是%v \n 年齡是%v \n 薪水是 %v \n 是否通過考試 %v ",name,age,sal,isPass)
4.go語言機制轉(zhuǎn)換
1)進制介紹
-
二進制 : 0,1 滿2進1在golang中不能直接使用二進制表示一個整數(shù),因為他沿襲了C語言的風(fēng)格要輸出就%b
-
十進制:0~9滿10進1
-
八進制:0~7滿8進1,以數(shù)字0開頭表示
-
十六進制:0~9A-F滿16進1以0x或0x開頭表示
此處A~F不區(qū)分大小寫
如:0x21AF+1=02x21B0
2)案例使用
func main(){
var i int =5;
fmt.Printf("%d的二進制是%b\n",i,i) //輸出的結(jié)果是:5的二進制是101
//八進制:0~7,滿8進1,以數(shù)字0開頭進行表示
var j int = 011
fmt.Println("j=",j) //9
//0~9及A-F以0x或0X表示
var k int = 0x11
fmt.Println("k=",k) //17
}
進制轉(zhuǎn)換的介紹
第一組(其他進制轉(zhuǎn)換為十進制)
1)二進制轉(zhuǎn)十進制
規(guī)則:從最低位開始(右邊的),將每個位上的數(shù)提取出來,乘以2的(位數(shù)-1)次方然后求和
案例:請將二進制:1011轉(zhuǎn)成十進制的數(shù)
1011=1*1+1*2+0*2*2+1*2*2*2=1+2+0+8=11
2)八進制轉(zhuǎn)十進制
規(guī)則:從最低位開始(右邊的),將每個位上的數(shù)提取出來,乘以8的(位數(shù)-1)次方然后求和
請將0123轉(zhuǎn)成十進制的數(shù)
3+2*8+1*8*8=83
3)十六進制轉(zhuǎn)十進制
規(guī)則:從最低位開始(右邊的),將每個位上的數(shù)提取出來,乘以8的(位數(shù)-1)次方然后求和
請將0x34A轉(zhuǎn)成十進制的數(shù)
10+4*16+3*16*16=842
第二組(十進制轉(zhuǎn)其他進制)
1)十進制轉(zhuǎn)二進制
規(guī)則:將該數(shù)不斷除于2,直到商為0為止,然后將得到的余數(shù)倒過來就是對應(yīng)的二進制
案例;請將56轉(zhuǎn)成2進制
2)十進制轉(zhuǎn)八進制
規(guī)則:將該數(shù)不斷除于8,直到商為0為止,然后將得到的余數(shù)倒過來就是對應(yīng)的二進制
3)十進制轉(zhuǎn)十六進制
規(guī)則:將該數(shù)不斷除于16,直到商為0為止,然后將得到的余數(shù)倒過來就是對應(yīng)的二進制
第三組
1)二進制轉(zhuǎn)八進制
規(guī)則:將二進制數(shù)每三位一組(從低位開始組合),轉(zhuǎn)成對應(yīng)的八進制數(shù)即可
案例將二進制 11010101轉(zhuǎn)成八進制
11010101=0325
2)二進制轉(zhuǎn)十六進制
規(guī)則:將二進制每四位數(shù)一組(從低位開始組合),轉(zhuǎn)換對應(yīng)的十六進制數(shù)即可
案例:請將二進制:11010101轉(zhuǎn)成16進制數(shù)為:0XD5
11100101 轉(zhuǎn)化為八進制:0345
1110010110轉(zhuǎn)化為十六進制:0x396
第四組
1)將八進制數(shù)每1位轉(zhuǎn)成對應(yīng)的一個3位的二進制數(shù)即可
案例:請將0237轉(zhuǎn)成二進制
0237=10011111
2)將十六進制每1位轉(zhuǎn)成1個4位的二進制數(shù)
0x3D=0x111101
原碼 補碼反碼
golang有三個位運算
2的補碼:00000010
3的補碼 00000011
2&3=00000010 =2
2|3=00000011=3
2^3=00000001
-2^2=-4
-2的原碼為:10000010
-2的反碼為:11111101
-2的補碼:11111110
2的補碼 00000010
故-2^2=11111100 的原碼是先求出他的反碼然后進行取反操作
反碼=補碼-1:11111011==》原碼(符號位不變其他取反):10000100=-4文章來源:http://www.zghlxwxcb.cn/news/detail-674377.html
-1:10000001=》反碼=》11111110補碼:11111111 +00000001=全是0文章來源地址http://www.zghlxwxcb.cn/news/detail-674377.html
func main(){
//位運算的知識演示
fmt.Println(2&3) //2
fmt.Println(2|3)//3
fmt.Println(2^3)//1
//下面是帶有負數(shù)的二進制
fmt.Println(-2^2)//-4
}
golang有兩個移位運算符
>> 右移、 <<左移
右移運算符 >>:低位溢出,符號位不,并用符號位補溢出的高位
左移運算符<< 符號位不變,低位補0
案例演示:
都要將原來的數(shù)變成補碼進行運算
a:=1>>2//00000001=>00000000=0 右移即補碼左邊補0
c:=1<<2 //00000001=>00000100=4左移即補碼右邊補0
fmt.Println(1>>2)//0
fmt.Println(1<<2)//4
…(img-EvonRpVt-1693040914591)]
2的補碼:00000010
3的補碼 00000011
2&3=00000010 =2
2|3=00000011=3
2^3=00000001
-2^2=-4
-2的原碼為:10000010
-2的反碼為:11111101
-2的補碼:11111110
2的補碼 00000010
故-2^2=11111100 的原碼是先求出他的反碼然后進行取反操作
反碼=補碼-1:11111011==》原碼(符號位不變其他取反):10000100=-4
-1:10000001=》反碼=》11111110補碼:11111111 +00000001=全是0
func main(){
//位運算的知識演示
fmt.Println(2&3) //2
fmt.Println(2|3)//3
fmt.Println(2^3)//1
//下面是帶有負數(shù)的二進制
fmt.Println(-2^2)//-4
}
到了這里,關(guān)于go學(xué)習(xí)-指針 標識符的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!