Golang - 指針與引用


​ Golang有指針 , 但是有些人生下來就是指針類型哇 , 跟Java的對象一樣, 天生他就是一個指針類型. 但是Golang有些人不是哇, 他生下來不是指針類型. 難受不, 怎么區分呢 , 我教大家一個小妙招 . 看我下面這個例子

記住用偉大的Jetbrains的編譯器Goland, 可以提示代碼錯誤奧 !

package main

import "fmt"

func main() {
	// 生下來一個ch
	ch := make(chan int)
	
	// ch如果是指針類型就可以和nil比較了
	fmt.Println(ch==nil)
}

**就上訴一段代碼 , 讓你明白啥對象生下來我就是指針類型. 啥對象生下來他不是指針類型 , 如果你掌握了,我覺得那些書你不用看了 ,編程拼的就是巧和效率 , 如果有些人跟你說一堆 , 啥是引用類型,啥是按值傳遞 , 算了別看, 就看我這個, 他是誤導你了, 是有些對象生下來他就是指針類型 , 懂了嗎, 編譯器做的你改不了, 你要改就寫個編譯器 . **

我給大家列出來 , 哪些對象哇 , 他生下來就是指針類型. 都是靠我上面的小技巧獲取的,還有自己的一些經驗

生下來就是指針類型

  • chan , 是一個阻塞隊列,你可以這么理解, 后期學習吧, 類似於Java的BlockingQueue .

  • map , 偉大的map , 其實就是Java的HashMap.

  • 切片(slice) , 就是沒有指定長度的數組 ,類似於Java的ArrayList,會自動擴容.

  • 函數 , 比如 fun := func(s string) string { return "modify" + s }

  • interface : 一個類型為interface{} 或者 interface接口 的變量可能是指針變量 , 也可能是普通變量 .

    // 定義一個接口
    type UserService interface {
    }
    // str可以是指針類型變量也可以是普通變量 , fun5也是
    func fun4(str interface{}) {
    }
    func fun5(str UserService) {
    }
    
    func main() {
    	// u 代表是一個指針類型變量或一個普通變量 ,同理 var x interface{} 也是代表一個指針類型變量或一個普通變量
    	var u UserService
    	// 調用
    	fun4(u)
    	fun5(u)
    }
    
  • function type. 比如 type Func func(string) , 這個 Func就是一個function type.

    type Func func(string)
    func main() {
    	fun := Func(func(s string) {})
    	fmt.Println(fun == nil) // false
    }
    

生下來不是指針類型的

  • struct , 如果成員變量為基本數據類型就是初始化值, 如果成員變量的指針類型則是nil.(前提你不賦值的情況下.)

  • 基本數據類型,初始化值如下

    bool //默認值為false
    string //默認值為空字符串,為""
    int int8 int16 int32 int64 //默認值為0
    uint uint8 uint16 uint32 uint64 uintptr //默認值為0
    byte // uint8 的別名
    rune // int32 的別名
    float32 float64 //默認值為0
    complex64 complex128 //默認值為0
    
  • 數組 , 數組是初始化就定義了大小的 , 記得與切片區分開.

兩大操作符

操作符&(取址符) : 是返回該變量的內存地址。
操作符* (取值符) : 是返回該指針指向的變量的值, 同時也可以進行修改指針指向內存地址的值.

空指針 :

當一個指針類型的變量被定義后沒有分配到任何變量時,它的值為 nil。
nil 指針也稱為空指針。
nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值.

占位符

%d										十進制整數
%x,	%o,	%b								十六進制,八進制,二進制整數。
%f,	%g,	%e								浮點數:	3.141593	3.141592653589793	3.141593e+00 
%t										布爾:true或false 
%c										字符(rune)	(Unicode碼點) 
%s										字符串 
%q										帶雙引號的字符串"abc"或帶單引號的字符'c'
%v										變量的自然形式(natural	format) 
%T										變量的類型 
%%										字面上的百分號標志(無操作數)
%p										打印指針類型的地址(十六進制)

Golang 的全部類型

​ 這個是官方給的類型, 只有兩種 一種是數值類型一種是派生類型.

數值類型

  • 布爾型

    bool 布爾型的值只可以是常量 true 或者 false,默認值為 false

  • 字符串類型

    string 編碼統一為 UTF-8 編碼標識 Unicode 文本,默認值為空字符串。

  • 整型(默認值為 0)

    • uint8: 無符號 8 位整型(0 ~ 255);
    • uint16:無符號 16 位整型(0 ~ 65535);
    • uint32:無符號 32 位整型(0 ~ 4294967295);
    • uint64:無符號 64 位整型(0 ~ 18446744073709551615);
    • int8:有符號 8 位整型(-128 ~ 127);
    • int16:有符號 16 位整型(-32768 ~ 32767);
    • int32:有符號 32 位整型(-2147483648 ~ 2147483647);
    • int64:有符號 64 位整型(-9223372036854775808 ~ 9223372036854775807)
  • 浮點型(默認值為 0)

    • float32IEEE-754 32 位浮點數;
    • float64IEEE-754 64 位浮點數;
    • complex64:32 位實數和虛數;
    • complex128:64 位實數和虛數;
  • 其他數值類型

    • byte:類似 uint8
    • rune:類似 int32
    • uint:32 或 64 位;
    • int:與 uint 一樣大小;
    • uintptr:無符號整型,用於存放一個指針;

派生類型

  • 指針類型(Pointer)
  • 數組類型 ([len]byte)
  • 結構化類型(struct)
  • Channel 類型(chan)
  • 函數類型(func)
  • 切片類型(slice)
  • 接口類型(interface)
  • Map 類型(map)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM