02 Go数据类型-变量基本使用-连续定义

一、数据类型

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    /*
    1.如何计算数据占用大小
    在C语言中我们可以通过sizeof来计算数据类型占用的内存大小
    在Go语言中我们也可以通过sizeof来计算数据类型占用的内存大小

    2.如何使用sizeof
    2.1导入unsafe
    2.2利用unsafe.Sizeof调用函数

    注意点:
    Go语言中的int类型, 会根据当前系统自动调整, 如果系统是64位的, 那么int就会自动变成int64,
                        如果系统是32位的, 那么int就会自动变成int32
     */
     // 1.有符号的整型
    fmt.Println("int size = ", unsafe.Sizeof(int(0)))
    fmt.Println("int8 size = ", unsafe.Sizeof(int8(0)))
    fmt.Println("int16 size = ", unsafe.Sizeof(int16(0)))
    fmt.Println("int32 size = ", unsafe.Sizeof(int32(0)))
    fmt.Println("int64 size = ", unsafe.Sizeof(int64(0)))
    fmt.Println("-------------------------------------")

    // 2.无符号的整型
    fmt.Println("uint size = ", unsafe.Sizeof(uint(0)))
    fmt.Println("uint8 size = ", unsafe.Sizeof(uint8(0)))
    fmt.Println("uint16 size = ", unsafe.Sizeof(uint16(0)))
    fmt.Println("uint32 size = ", unsafe.Sizeof(uint32(0)))
    fmt.Println("uint64 size = ", unsafe.Sizeof(uint64(0)))
    fmt.Println("uintptr size = ", unsafe.Sizeof(uintptr(0)))
    fmt.Println("-------------------------------------")

    // 3.字符类型
    // byte相当于C语言中的char, 专门用于保存一个字符  'a'
    // rune本质是int32, 专门用于保存一个中文字符      '李'
    // 注意点: GO语言默认就支持中文,默认就是按照UTF-8来处理 , 在UTF-8中一个中文占3个字节
    // 过去有时候在Windows中一个中文占2个字节, 在Linux中一个中文占3个字节, 非常不方便我们做兼容处理, 所以Go有效的解决了过去的这个问题
    fmt.Println("byte size = ", unsafe.Sizeof(byte(0)))
    fmt.Println("rune size = ", unsafe.Sizeof(rune(0)))
    fmt.Println("-------------------------------------")

    // 4.浮点 类型
    fmt.Println("float32 size = ", unsafe.Sizeof(float32(0)))
    fmt.Println("float64 size = ", unsafe.Sizeof(float64(0)))
    fmt.Println("-------------------------------------")

    // 5.布尔类型
    fmt.Println("true size = ", unsafe.Sizeof(true))
    fmt.Println("false size = ", unsafe.Sizeof(false))
}

结果:

int size =  8
int8 size =  1
int16 size =  2
int32 size =  4
int64 size =  8
-------------------------------------
uint size =  8
uint8 size =  1
uint16 size =  2
uint32 size =  4
uint64 size =  8
uintptr size =  8
-------------------------------------
byte size =  1
rune size =  4
-------------------------------------
float32 size =  4
float64 size =  8
-------------------------------------
true size =  1
false size =  1

Process finished with exit code 0

二、变量的基本使用

package main

import "fmt"

func main() {
    /*
    1.什么是变量?
    1.1在C语言中可以改变的数据我们称之为变量
    1.2Go语言和C语言一样, 改变的数据我们称之为变量

    2.为什么要定义变量?
    1.1在C语言中就是为了告诉操作系统, 需要分配多大的存储空间来存储数据
    1.2在Go语言中也是一样

    3.如何定义变量?
    3.1C语言定义变量的格式:   数据类型 变量名称;
    3.2Go语言中定义变量的格式:  var 变量名称 数据类型;

    4.如何使用变量?
    4.1C语言中如果变量名称在等号的左边, 代表往变量中存储数据
       如果变量名称在等号的右边出现, 代表从变量中获取存储的数据
    4.2Go语言和C语言一样

    5.变量的初始化
    5.1在C语言中第一次给变量赋值我们称之为变量的初始化
       在C语言中变量的初始化有两种方式: 1.先定义在初始化 2.定义的同时初始化
    5.2Go语言和C语言一样

    注意点:
    在Go语言中, 除了有和C语言一样的定义变量的格式以外, 还有一些其它的格式
    1.如果定义的同时初始化, 那么定义变量时, 数据类型可以省略(系统会自动根据赋值推导变量的类型)
    2.如果定义的同时初始化, 那么定义变量时, 除了可以省略数据类型以外, 还可以利用:=继续省略var

    :=注意点:
    1.如果利用:=定义变量, 那么不能写var也不能写数据类型
    2.因为:=会先定义一个变量, 所以不能把:=当做=来使用(=必须先定义,否则报错)
     */

     // 1.定义一个变量
     /*
     var num int
     num = 666
     // 注意点: 在Go语言中, 输出整型只能使用%d, 不能使用%i
     fmt.Printf("%d\n", num)
     */

     // 2.先定义再初始化
    // var num int
    // num = 888
    //fmt.Printf("%d\n", num)

    // 3.定义的同时初始化
    //var num int = 999
    //fmt.Printf("%d", num)

    // 4.定义的同时初始化, 并省略数据类型
    //var num  = 999
    //fmt.Printf("%d\n", num)
    //// 在Go语言中, 可以利用%T输出变量的数据类型
    //fmt.Printf("%T\n", num)

    // 5.定义的同时初始化, 并省略数据类型和var
    // :=做了两件事情 , 1.会先定义一个变量 2.给定义的变量赋值
    // 在Go语言开发中非常非常非常常用
    //num := 666
    //fmt.Printf("%d\n", num)

    // 6.:=注意点
    //var num := 666 // 语法错误
    //num int := 666 // 语法错误
    //fmt.Printf("%d\n", num)

    var num int = 666
    // var num int
    // num = 888
    //num := 888 // 重复定义
    fmt.Printf("%d\n", num)
}

三、变量的连续定义

package main

import "fmt"

func main() {
    /*
    1.变量的连续定义
    1.1在C语言中我们可以通过逗号来连续定义变量     int a, b, c;
    1.2在Go语言中我们也可以通过逗号来连续定义变量 var a, b, c int
    1.3在Go语言中除了可以利用逗号来连续定义变量以外, 还可以使用变量组的语法来同时定义多个变量
    var(
       a int
       b int
       c int
    )

    2.同时定义多个变量, 也可以在定义的时候初始化
    2.1在C语言中我们可以通过   int a = 10, b = 20, c = 30;
    2.2在Go语言中如果通过逗号定义多个变量, 我们可以通过  var a, b, c = 10, 20, 30
    2.3在Go语言中如果通过变量组定义多个变量, 我们可以通过
    var(
       a int = 10
       b int = 20
       c int = 30
    )

    注意点:
    在变量组中, 不能使用:=
     */

     // 1.通过逗号定义多个变量
     /*
     var a, b, c int
     a = 123
     b = 456
     c = 789
     fmt.Printf("%d,%d,%d\n", a, b, c)
     */

     // 2.通过变量组定义多个变量
     /*
     var(
        a int
        b int
        c int
     )
    a = 123
    b = 456
    c = 789
    fmt.Printf("%d,%d,%d\n", a, b, c)
     */

     // 3.同时定义多个变量, 并且同时初始化
     //var a, b, c int = 10, 20, 30
     //var a, b, c = 10, 20, 30
    // a, b, c := 10, 20, 30
    //fmt.Printf("%d,%d,%d\n", a, b, c)


    // 4.同时定义多个变量, 并且同时初始化
    //var(
    //  a int = 10
    //  b int = 20
    //  c int = 30
    //)

    //var(
    //  a  = 10
    //  b  = 20
    //  c  = 30
    //)
    //fmt.Printf("%d,%d,%d\n", a, b, c)


    // 5.注意点: 在变量组中, 不能使用:=
    var( 
        a  := 10
        b  := 20
        c  := 30
    )
    fmt.Printf("%d,%d,%d\n", a, b, c)
}

结果:

syntax error: unexpected :=, expecting type

四、全局变量和局部变量

package main

import "fmt"
func test()  {
    //fmt.Printf("%d\n", num) //报错,找不到num
    fmt.Printf("%d\n", value)
}
var value int // 全局变量
//var value int // 报错 重复定义
func main() {
    /*
    1.什么是局部变量?
    1.1在C语言中写在{}中或者函数中或者函数的形参, 就是局部变量
    1.2Go语言中的局部变量和C语言一样

    2.什么是全局变量?
    2.1在C语言中写在函数外面的就是全局变量
    2.2Go语言中的全局变量和C语言一样

    3.局部变量和全局变量的作用域
    3.1在C语言中局部变量的作用域是从定义的那一行开始, 直到遇到}结束或者遇到return为止
    3.2Go语言中局部变量的作用域和C语言一样
    3.3在C语言中全部变量的作用域是从定义的那一行开始, 直到文件末尾为止
    3.4Go语言中的全局变量, 只要定义了, 在定义之前和定义之后都可以使用

    4.局部变量和全局变量的生命周期
    4.1在C语言中局部变量, 只有执行了才会分配存储空间, 只要离开作用域就会自动释放, C语言的局部变量存储在栈区
    4.2Go语言局部变量的生命周期和C语言一样
    4.3在C语言中全局变量, 只要程序一启动就会分配存储空间, 只有程序关闭才会释放存储空间, C语言的全局变量存储在静态区(数据区)
    4.4Go语言全局变量的生命周期和C语言一样

    5.局部变量和全局变量的注意点
    5.1在C语言中相同的作用域内, 不能出现同名的局部变量
    5.2Go语言和C语言一样, 相同的作用域内, 不能出现同名的局部变量
    5.3在C语言中相同的作用域内, 可以出现同名的全局变量
    5.4在Go语言中相同的作用域内, 不能出现同名的全局变量

    6.特殊点
    6.1在C语言中局部变量没有初始化存储的是垃圾数据, 在Go语言中局部变量没有初始化, 会默认初始化为0
    6.2在C语言中全局变量没有初始化存储的是0, Go语言和C语言一样
    6.3在Go语言中, 如果定义了一个局部变量, 但是没有使用这个局部变量, 编译会报错
    6.4在Go语言中, 如果定义了一个全局变量, 但是没有使用这个全局变量, 编译不会报错
     */

     //var num int; // 局部变量
     //var num int; // 报错
     //fmt.Printf("%d\n", num)
    test()
}

五、变量的注意点

package main

import "fmt"

//value := 789 //编译不通过
func main() {
    /*
    1.相同的作用域内, 无论是全局变量还是局部变量, 都不能出现同名的变量
    2.变量离开作用域就不能使用
    3.局部变量如果没有使用, 编译会报错, 全局变量如果没有使用, 编译不会报错
    4.:=只能用于局部变量, 不能用于全局变量
    5.:=如果用于同时定义多个变量, 会有退化赋值现象
     */

     // 1.:=只能用于局部变量
     //num := 666
     //fmt.Printf("%d\n", num)

     // 2.:=退化赋值现象
     // 2.1 var num int
     // 2.2 num = 123
     num := 123
     //num := 456 // 报错

     // 如果通过:=定义多个变量, 但是多个变量中有的变量已经在前面定义过了,
     // 那么只会对没有定义过的变量执行:=, 而定义过的变量只执行=操作
     // 1. var value int
     // 2. num = 456
     // 3. value = 789
    num, value := 456, 789
    fmt.Printf("%d, %d", num, value)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 今天不说学的什么了!说说今天看到:队友们都各自好忙!眼睛都像放了光!有在斑马线给顾客一直介绍的你!有在商场里给顾客...
    小雪A阅读 186评论 1 4
  • 天天很热,白天出门是烘烤的感觉,只有呆在屋里舒服点,还好多数时间都是呆在办公室,就是感觉身体活动太少了,做久了不舒...
    带露珠的叶子阅读 145评论 0 0
  • 时隔多年,小月终于鼓起勇气在对话框中输入了“最近怎么样啊”加了一个笑脸表情包,事先她预想了好几种可能回复的...
    ZXYJT阅读 241评论 0 0