有時候看別人的go代碼,發(fā)現(xiàn)他們有的在代碼里面用了指針,有的不使用。
創(chuàng)新互聯(lián)建站是一家集成都做網(wǎng)站、網(wǎng)站設計、網(wǎng)站頁面設計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站建設公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設服務。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務才是根本,我們始終堅持講誠信,負責任的原則,為您進行細心、貼心、認真的服務,與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
假設有個結構體類型叫做Person,發(fā)現(xiàn)有些方法會用func methodA (*person Person)作為參數(shù),或者使用 func *(person Person) methodA()作為結構體自己的方法,也就是person這個結構體可以直接調(diào)用methodA,但是用的是指針。
或者在map結構里面看到var personMap map[string]*Person 的用法
如果是從java轉(zhuǎn)過來golang的話,可能不太好理解。因為java的世界是沒有指針的,直接傳遞過去就可以用了,但是到golang上需要注意很多地方。
那么什么時候該用呢?為什么有些地方需要用呢?
不使用指針的話,某些情況是沒法賦值給結構體的,接下來看一段代碼,這段代碼不使用任何指針,先定義一堆用于測試的對象
type Person struct { //person結構體,包含年齡,名稱,車 age int name string car Car } type Car struct { //person名下的車 name string //車的名字 } var personMap map[string]Person //一個存放person的map func setName(person Person, name string) { //給參數(shù)person設置名字 person.name = name } func (person Person) setName(name string) { //設置名字 person.name = name } func printName(person Person){ //打印person的名字 fmt.Println(person.name) } func (person Person)printName(){ //結構體person自己支持打印名字 fmt.Println(person.name) }
然后編寫main方法,我會在代碼里面注釋打印的結果,可以發(fā)現(xiàn)很多情況下賦值失敗了。
func main() { person := Person{} fmt.Println(person) //{0 {}} person.age = 12 person.name = "小明" person.car = Car{"寶馬"} fmt.Println(person) //{12 小明 {寶馬}},正常賦值給person變量,因為這是在方法里面的變量 setName(person, "小紅") fmt.Println(person) //{12 小明 {寶馬}},小紅賦值失敗,傳遞給setName方法的person沒有賦值成功 person.setName("小紅") fmt.Println(person) //{12 小明 {寶馬}},person自己setName,還是失敗 personMap = make(map[string]Person) personMap["test"] = person person = personMap["test"] person.name = "小紅" fmt.Println(person) //{12 小紅 {寶馬}},從map中取出person,給小紅賦值成功 for _, value := range personMap { //遍歷map fmt.Println(value)//{12 小明 {寶馬}},打印的還是小明,而不是小紅,說明上面personMap["test"]對象賦值失敗 } }
接下來改造成使用指針
type Person struct { age int name string car Car } type Car struct { name string } var personMap map[string]*Person func setName(person *Person, name string) { person.name = name } func (person *Person) setName(name string) { person.name = name } func printName(person Person){ fmt.Println(person.name) } func (person Person)printName(){ fmt.Println(person.name) }
修改main方法,使用&取址符
func main() { person := Person{} fmt.Println(person) //{0 {}} person.age = 12 person.name = "小明" person.car = Car{"寶馬"} fmt.Println(person) //打印{12 小明 {寶馬}} setName(&person, "小紅") fmt.Println(person) //{12 小紅 {寶馬}}, 成功賦值! person.setName("小黑") fmt.Println(person) //{12 小黑 {寶馬}}, 成功賦值! personMap = make(map[string]*Person) personMap["test"] = &person person = *personMap["test"] person.name = "小蘭" fmt.Println(person) //{12 小蘭 {寶馬}},成功賦值! for _, value := range personMap { fmt.Println(value) //&{12 小蘭 {寶馬}},讀取的也是正確的小蘭 } }
所以得出結論,當我們需要修改結構體的變量內(nèi)容的時候,方法傳入的結構體變量參數(shù)需要使用指針,也就是結構體的地址需要修改map中的架構體的變量的時候,也需要使用結構體地址作為map的value
如果僅僅是讀取結構體變量,可以不使用指針,直接傳遞引用即可
*type 這里的type這個變量存放的東西是地址,這點需要明確,需要使用&type獲取到地址。
以上就是golang不用指針可以嗎的詳細內(nèi)容,更多請關注創(chuàng)新互聯(lián)其它相關文章!
分享文章:如何在golang中使用指針
標題鏈接:http://chinadenli.net/article12/gehjdc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務器、面包屑導航、網(wǎng)站排名、營銷型網(wǎng)站建設、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)