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

    • float32:IEEE-754 32 位浮点数;
    • float64:IEEE-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. c++ vector 的坑

    一个空的vector执行pop_back操作会发生什么 由于之前看STL源码剖析的时候,发现所执行的操作如下: 只是简单的将末尾的finish迭代器减1后destroy.这让人产生一个疑问:假如这个v ...

  2. java中发送http请求的方法

    package org.jeecgframework.test.demo; import java.io.BufferedReader; import java.io.FileOutputStream ...

  3. Mysql的SQL优化指北

    概述 在一次和技术大佬的聊天中被问到,平时我是怎么做Mysql的优化的?在这个问题上我只回答出了几点,感觉回答的不够完美,所以我打算整理一次SQL的优化问题. 要知道怎么优化首先要知道一条SQL是怎么 ...

  4. Visual Studio 2017 安装心得

    既然VS2017已经发布了,就想安装一下试试,先卸载VS2015, 网上有个完全卸载的东东,https://github.com/Microsoft/VisualStudioUninstaller/r ...

  5. 洛谷$P2050\ [NOI2012]$美食节 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...

  6. teamviewer早期版本下载链接

    https://www.teamviewer.cn/cn/download/previous-versions/

  7. 手把手带你了解消息中间件(2)——RabbitMQ

    RabbitMQ官网: http://www.rabbitmq.com/ Erlang官网:https://www.erlang.org 友情提示:RabbitMQ基于Erlang语言开发的,要想使用 ...

  8. Intellij Idea插件使用记录之Alibaba Java Coding Guidelines

    目录 Intellij Idea插件Alibaba Java Coding Guidelines 前言 使用 感谢 Intellij Idea插件Alibaba Java Coding Guideli ...

  9. JavaScript中函数式编程中文翻译

    JavaScript 中的函数式编程 原著由 Dan Mantyla 编写 近几年来,随着 Haskell.Scala.Clojure 等学院派原生支持函数式编程的偏门语言越来越受到关注,同时主流的 ...

  10. CSS3(5)---伸缩布局(Flex)

    CSS3(5)---伸缩布局 有关页面布局之前写过三篇相关文章: 1.CSS(5)---盒子模型 2.CSS(6)---浮动(float) 3.CSS(8)---定位(position) 一.什么是F ...