​ 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. KAFKA报错:COMMIT CANNOT BE COMPLETED SINCE THE GROUP HAS ALREADY REBALANCED AND ASSIGNED THE PARTITIONS TO ANOTHER MEMBER

    转载:https://www.greenhtml.com/archives/Commit-cannot-be-completed-since-the-group-has-already-rebalan ...

  2. 从头学pytorch(六):权重衰减

    深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模 ...

  3. .NETCore3.1中的Json互操作最全解读-收藏级

    前言 本文比较长,我建议大家先点赞.收藏后慢慢阅读,点赞再看,形成习惯! 我很高兴,.NETCore终于来到了3.1LTS版本,并且将支持3年,我们也准备让部分业务迁移到3.1上面,不过很快我们就遇到 ...

  4. docker mysql配置挂载到卷

    docker--将mysql配置挂载到卷 1.首先在根目录创建两个文件夹,其中config文件夹中创建my.cnf配置文件.data文件夹存放数据文件,一定要为空. /docker/mysql/con ...

  5. 工具系列 | Docker基本概念小结

    ▍什么是Docker? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容 ...

  6. spring注解之@Import注解的三种使用方式

    目录 1.@Import注解须知 2.@Import的三种用法 3.@Import注解的三种使用方式总结 @ 1.@Import注解须知 1.@Import只能用在类上 ,@Import通过快速导入的 ...

  7. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  8. c++简单实现循环队列

    栈的数据结构是先进后出,而队列的数据结构就是 一个出口一个入口入口只能入队,出口只能出队 实现的代码如下: /* 循环静态队列实现 2017年8月5日07:50:58 */ #ifndef __QUE ...

  9. bootstrap 轮播craousel 采坑之(修改默认鼠标浮动轮播不停止)

    首先上bootstrap 官网 https://v3.bootcss.com/javascript/#carousel 设置这个参数就可以,后面说如何采坑.见代码 html 部分 <!-- 轮播 ...

  10. python django 基本环境配置

    创建虚拟环境: python -m venv django启动虚拟环境: .\venv\Scripts\activate下载django: pip install django查看django命令: ...