​ 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)

Golang - 指针与引用的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. Golang指针

    学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址. 那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不 ...

  3. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  4. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  5. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  6. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  7. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  8. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  9. c++指针与引用问题

    本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...

随机推荐

  1. redis分布式锁使用方法

    引用: StackExchange.Redis.dll Redlock.CSharp.dll RedLock.dll 代码: public class RedlockHelper { public v ...

  2. windows键的妙用

    (1)当你需要暂时离开电脑一会儿,怕其余人动你的电脑时,你只需要按windows键+L就可以了,当然前提是你给自己的电脑设置过开机密码. (2)有时候你需要在盘里边找某个文件,但你的桌面上密密麻麻的, ...

  3. VUE事件修饰符.passive、.capture、.once实现原理——重新认识addEventListener方法

    https://www.jianshu.com/p/b12d0d3ad4c1 .passive的作用与使用场景 https://juejin.im/post/5ad804c1f265da504547f ...

  4. 第二阶段:4.商业需求文档MRD:1.PRD-产品功能列表

    这就是对功能清单的梳理已经优先级筛选

  5. 洛谷$P$1402 酒店之王 网络流

    正解:网络流 解题报告: 传送门! 一看就很网络流昂,,,于是现在的问题就变成怎么建图了$QwQ$ 首先如果只有一个要求,那就直接按要求建图然后跑个最大流就好. 现在变成,有两个要求,必须同时满足,考 ...

  6. 10_时间戳timeStamp 和 时间 time 转换, 根据时间节点倒计时

    1: 时间戳 timeStamp 获取的几种方法及其优劣, 第一种只能精确到秒, 故不推荐使用, 最最常用的也是最官方的是第三种, 通过原型方法进行调用获取精确到毫秒数 : var timestamp ...

  7. RAID阵列

    • 廉价冗余磁盘阵列– Redundant Arrays of Inexpensive Disks– 通过硬件/软件技术,将多个较小/低速的磁盘整合成一个大磁盘– 阵列的价值:提升I/O效率.硬件级别 ...

  8. 在.NET Core中批量注入Grpc服务

    GRPC 是谷歌发布的一个开源.高性能.通用RPC服务,尽管大部分 RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2.还有就是它具有跨平台.跨语言 等特性 ...

  9. Matlab学习过程中的一些小问题

    1.Overload your functions by having variable number of input and output argumernt.Not only can we ov ...

  10. 【python小随笔】动态创建变量名

    PS:有时候我们不知道列表组数里存放几个值,但是又要动态的遍历这些值并且动态的创建每一个对应的一个变量里: t = ['B0716PK6R2','B077X9J24C','B01N2SBH4J'] c ...