成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你了解Go語言基礎之指針

開發 后端
作為21世紀的C語言,Go可能多方面思考,最終還是保留了指針。但是要比C語言指針簡單很多,一起來看看叭。

[[351627]]

前言

Hey,大家好呀,我是星期八

作為21世紀的C語言,Go可能多方面思考,最終還是保留了指針。

但是要比C語言指針簡單很多,一起來看看叭。

引言

因為Go語言是類C語言,所以為了提高效率,仍然保留了指針。

但是如果沒有接觸過指針,可能學起來指針需要多多思考一下了。

指針通常情況下,也被稱為小白勸退神奇。

基本類型指針的理解

先看這兩行代碼。

  1. var n1 int = 666 
  2. fmt.Println(n1)//結果:666 
  3. fmt.Printf("%p\n",n1)//結果:%!p(int=666),說明不是一個地址,就是一個值 

內存分布圖如下。

再看看這樣兩行代碼,這里用到了&。

  1. var n1 int = 1 
  2. //表示取n1的地址 
  3. fmt.Println(&n1)//結果:0xc00000a0b8 
  4. fmt.Printf("%p\n",&n1)//結果:0xc00000a0b8 

如圖所示。

如果這兩個能理解,恭喜你,指針已經會了一半了。

引用類型指針的理解

先看這樣的代碼。

  1. var studentList = []string{"張三", "李四"}//一個切片 
  2. fmt.Println(studentList)        //結果:[張三 李四] 
  3. fmt.Printf("%p\n", studentList) //結果:0xc0000044a0 
  4. //去地址 
  5. fmt.Printf("%p\n", &studentList) //結果:0xc0000044a0 

內存分布圖如下。

值類型和引用類型

值類型

在Go中,值類型主要有。

int,float,bool,string,數組,struct(結構體)

內存分布大致如下。

注:像字符串,數組,結構體這些屬于連續存儲,變量指向的是它們的第一個地址,剩下的會根據長度計算。

引用類型

在Go中,引用類型主要有。

切片(slice),map,管道(chan)

內存分布大致如下。

棧內存和堆內存的區別

棧內存在存儲上,只能存一些簡單的東西,比如數字了,字符了,浮點數了之類的,但是棧內存分配的內存程序員不用回收,由系統自己回收,并且性能很高。

堆內存在存儲上就比較豐富了,隨便存,像map,隨便塞,但是堆內存分配的內存需要程序員自己回收,典型例子,C++,如果語言由GC由GC回收,性能稍弱那么一點點點....,但是人家能隨便存啊,多隨便。

&和*的意思

&叫做取地址符。

*叫做收地址符吧。

示例

  1. var c *int//*int是一個整體,說明c這個變量只能接收int類型的 

*int是一個整體,表示c這個變量只能接收int類型的地址。

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main() { 
  6.     var c *int 
  7.     var d int = 1 
  8.     //c = d//錯誤需要的是d的地址 
  9.     c = &d 
  10.     fmt.Println(c) 

執行結果。

可以看到打印的也是一個地址,但是內存圖還是基本類型圖。

如果要打印c的值,直接*c就好了,取得就是地址里面對應得值了。

  1. fmt.Println(*c) 

關于函數

我們一直在強調,操作只會操作棧上面的值,函數同理。

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say1(x int) { 
  6.     //x int 相當于隱藏了一行代碼 
  7.     //隱藏的代碼時 var x int = x,一定要記住這個 
  8.     fmt.Printf("say1:%p\n", x) 
  9. func say2(x *int) { 
  10.     //隱藏的代碼是 var x *int = x,x是一個地址 
  11.     fmt.Printf("say2:%p\n", x) 
  12. func say3(x []int) { 
  13.     //隱藏的代碼是 var x []int = x,因為x是引用類型,所以x是一個地址 
  14.     fmt.Printf("say3:%p\n", x) 
  15. func main() { 
  16.     say1(1)//棧上面是1,所以傳進去就是1 
  17.     var x1 = 1 
  18.     say2(&x1)//say只能接收整數地址 
  19.     var x2 = []int{1, 1} 
  20.     say3(x2)//x2是引用類型,所以傳進去的時候就是地址,棧上面的就是地址 

執行結果。

總結

上述我們主要講述了基本類型指針和引用類型指針,也叫做值類型和引用類型,并且畫出了值類型和引用類型內存的本質區分圖,后來又講了&和*的區別,還有函數傳參的本質是什么,希望對大家的學習有幫助。

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。

本文轉載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉載本文請聯系Go語言進階學習公眾號。

 

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2020-11-05 09:58:16

Go語言Map

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術

2020-12-30 09:04:32

Go語言TCPUDP

2020-12-27 10:15:44

Go語言channel管道

2020-12-07 05:59:02

語言Go接口

2021-10-30 10:43:04

語言Go函數

2021-11-03 10:02:07

Go基礎函數

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數據類型

2020-12-23 08:39:11

Go語言基礎技術

2021-02-20 10:06:14

語言文件操作

2021-01-13 08:40:04

Go語言文件操作
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久久久久久 | 日韩免费一区二区 | 国产精品爱久久久久久久 | 午夜欧美 | 中文字幕日本一区二区 | 极品粉嫩国产48尤物在线播放 | 99久久99久久精品国产片果冰 | 国产精品久久久一区二区三区 | 视频一区二区在线观看 | 日日夜夜免费精品 | 国产精品一区二区三区久久久 | 精品国产一区二区三区性色av | 精品国产精品三级精品av网址 | 日韩成人精品视频 | 日韩综合网 | 亚洲一区二区在线播放 | 日韩午夜在线观看 | jlzzjlzz欧美大全 | 中文字幕一区二区三区四区五区 | 久久夜夜 | 国产精品1区2区3区 国产在线观看一区 | 一区二区三区四区不卡 | 99精品国产一区二区三区 | 一区二区三区播放 | 亚洲视频中文 | 韩日一区二区 | 亚洲精品久久久久久一区二区 | 精品久久精品 | 色嗨嗨 | 国产伦精品一区二区三区精品视频 | 亚洲精品一二三 | 午夜精品久久久久久久久久久久久 | 亚洲精品国产第一综合99久久 | 女人毛片a毛片久久人人 | 91精品久久久久久久久久入口 | 一区二区在线 | 亚洲高清av | 成人中文字幕在线 | 国产免费a视频 | 中文字幕在线视频精品 | 欧美aⅴ片 |