go两种数据类型的区别、数据类型和操作符、常量、变量声明

值类型和引用类型

1、值类型:变量直接存储值,内存通常在栈中分配。  

  基本数据类型int、float、bool、string以及数组和struct。

2、引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。

  指针、slice(切片)、map、chan(管道)、interface等都是引用类型。

堆和栈的区别:
  一、堆栈空间分配区别:
  1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
  2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
  二、堆栈缓存方式区别:
  1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放,调用对象的速度较快;(栈空间)
  2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。调用对象的速度要相对慢一些。(物理硬盘空间)
  三、堆栈数据结构区别:
  堆(数据结构):堆可以被看成是一棵树,如:堆排序;
  栈(数据结构):一种先进后出的数据结构。(函数的调用就是栈,先进后出) 

值类型和引用类型实例:

实例一

实例二

 变量的作用域(全局区域只能声明变量,不能执行语句,a:=1,这类语句编译不能通过

1、在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部。在{ }里面的语句块里面的变量生命周期仅限于语句块。

2、在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的,则作用于整个程序。

实例一

实例二

实例三

数据类型和操作符

1、bool类型,只能存true和false

2、相关操作符, !、&&、||

3、数字类型,主要有int、int8、int16、int32、int64、uint8(无符号整形)、uint16、uint32、uint64、float32、float64

4、类型转换,type(variable),比如:var a int=8;  var b int32=int32(a)

5、逻辑操作符: == 、!=、<、<=、>和 >=

6、数学操作符:+、-、*、/等等

7、字符类型:var a byte

  var a byte = ‘c’

8、字符串类型: var str string

9、字符串表示两种方式: 1)" "双引号    2)``  反引号

所有整数初始化为0,所有浮点数初始化为0.0,所有布尔类型初始化为False

10、位操作符

a.与操作:&          1&1 =1  1&0 = 0  0&1 =0  0&0 = 0

b.或操作:|       1|1 = 1  1&0 = 1  0&1 =1  0&0 = 0

d.异或操作:^        1|1 = 0  1&0 = 1  0&1 =1  0&0 = 0

左移<<    1<<10=1024

右移>>        1024>>10=1

位操作符实例

常量

1.常量使用const 修饰,代表永远是只读的,不能修改。

2.const 只能修饰boolean,number(int相关类型、浮点类型、complex)和string。

3.语法:const identifier [type] = value,其中type可以省略。

const b string = “hello world”
const b = “hello world”
const Pi = 3.1414926
const a = 9/3

预定义常量:

比较优雅的写法:
const (
a = 0
b = 1
c = 2
)

更加专业的写法:
const (
a = iota  //a=0,后面的变量都在前面的基础上都加1
b    //1
c    //2
)

 变量

1、语法:var identifier type

    var v1 int
    var v2 string
    var v3 [10]int  //数组
     var v4 []int    //数组切片
     var v5 struct{
        f int
    }
    var v6 *int  //指针
     var v7 map[string] int
    var v8 func(a int)  //指针

第二种写法:

var (
       v1 int  //默认为0
       v2 string //默认为""
       v3 [10]int  //数组
        v4 []int    //数组切片
        v5 struct{
            f int
        }
       v6 *int  //指针
        v7 map[string] int
       v8 func(a int)  //指针
        v9 bool  //默认为false
    )

变量的初始化操作:

var v1 int = 10
var v2 = 10
v3 := 10 //不能用于全局变量的声明

原文地址:https://www.cnblogs.com/domestique/p/10011243.html

时间: 2024-07-28 22:30:16

go两种数据类型的区别、数据类型和操作符、常量、变量声明的相关文章

UIImage两种初始化的区别

UIImage可以通过以下两种方式进行初始化: 1 //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] 2 UIImage *image = [UIImage imageNamed:@"v_red_heart_selected"]; 1 //第二种初始化方式:[必须拼接图片的全名称,否则image的路径为空] 2 NSString *filePath = [[NSBundle mainBundle] pathForResou

PHP中数组合并的两种方法及区别介绍

PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = array( 'where' => 'uid=2', 'order' => 'uid desc', ); 1. array_merge,如果两个数组存在相同的key,后面的一个会覆盖前面的 复制代码代码如下: <?php $c = array_merge($a, $b); var_expo

UIimage两种初始化的区别 广告轮播封装

UIimage两种初始化的区别 第一种初始化: UIImage *image = [UIImage imageNamed:@"xxx"];  注意(这种方法加载的图片如果后缀名是png的,可以不写后缀名,根据屏幕分辨率自己去匹配图片) 第二种初始化: NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx.png" ofType:nil]; UIImage *image = [[UIImage al

jsp两种include指令区别

[转]:http://www.cnblogs.com/lazycoding/archive/2011/04/04/two_include.html <%@ include file="relativeURI"%> <jsp:include page="relativeURI" flush="true" /> 首先说明这两种都是什么: <%@ include file="relativeURI"%&

UIImage 两种初始化的区别

UIImage 两种初始化的区别 1.使用imageNamed:第一次读取的时候,先把这个图片放到缓存里,下次再使用到这个图片的时候直接从缓存中读取(优点:方便快捷,只有第一次使用的时候稍微慢,接下来在使用就会快点:缺点:如果在当前工程中只使用一次会浪费内存)[这个内次在程序关闭的时候才释放] 2.使用initWithContentsOfFile:每次都会根据路径去读取,不会占用内存,如果图片在当前工程中只使用一次,应该选用这个方法

ACE_linux:Reactor与Proactor两种模式的区别

一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很感兴趣: 事件分离者等着这个事件的发生: 当事件发生了,事件分离器被唤醒,这负责通知先前那个事件处理器: 事件处理器收到消息,于是去那个socket上读数据了. 如果需要,它再次宣称对这个socket上的读事件感兴趣,一直重复上面的步骤: 下面再来看看真正意义的异步模式Proactor是如何做的:

Java中serialVersionUID的解释及两种生成方式的区别(转载)

转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private static final long serialVersionUID = 1L;       一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:    

IOS UIImage两种初始化的区别

UIImage可以通过以下两种方式进行初始化: 1 //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] 2 3 UIImage *image = [UIImage imageNamed:@"v_red_heart_selected"]; 1 //第二种初始化方式:[必须拼接图片的全名称,否则image的路径为空] 2 NSString *filePath = [[NSBundle mainBundle] pathForRes

离散化的思想和它的两种代码与区别

离散化的思想和它的两种代码与区别 2017年06月15日 12:44:41 AC之路有笑有泪 阅读数:6905 版权声明:觉得好的话就给他人分享一下吧,欢迎转载,码字不容易啊,转载麻烦注明出处 https://blog.csdn.net/xiangAccepted/article/details/73276826 离散化是什么:一些数字,他们的范围很大(0-1e9),但是个数不算多(1-1e5),并且这些数本身的数字大小不重要,重要的是这些数字之间的相对大小(比如说某个数字是这些数字中的第几小,

Java中Compareable和Comparator两种比较器的区别

Java中Compareable和Comparator两种比较器的区别 1.引言 在java这个处处是对象的世界里,对两个对象进行按某一属性进行比较是特别常见的需求.比如书店中的书按照价格比较,亦或者是学生按照成绩进行排名等等. 对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo()方法: 3.抛去需要被比较的类,在其外部自定义一个单独的对象比较器,继