• 变量、类型、指针


    目录:

    1:世界开始之初-变量

    2:Go 语言中的基础类型

    3:go自增语法、指针

    4:go不能使用的语法

    一、世界开始之初-变量

    第1种:先定义变量,再赋值 。 var 变量名 数据类型

    var name string
    name = "cfp"
    fmt.Println("name:", name)    //name: cfp
    fmt.Printf("name:%s\n", name) //name:cfp

    第2种:定义时直接赋值。var 变量名 = “man”

    func main() {
    	var name string
    	name = "cfp"
    	fmt.Println("name:", name) //name: cfp
    
    	var age = 80 //第二种
    	fmt.Printf("name:%s,age:%d\n", name, age) //name:cfp
    }

    第3种:定义直接赋值,使用自动推导(最常用)

    func main() {
    	sex := "male" //第三种
    	fmt.Println(sex)
    }

    第4种:平行赋值 (同时定义两个变量)

    i,j := 10,20
    i,j:=j,i  (不借助中间变量,直接对换两个变量的值)

     要知道如果要定义全部变量的话,必须使用var 关键字,不能用我们常用的那种赋值

    二、基础类型

    Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。

    计算机中数据存储的最小单位为bit(位),0或者1

    byte:计算机中数据的基本单元,1字节=8bit,数据在计算机中存储或者计算,至少为1个字节

    • bool

    • string

    • int(随系统,一般是占用4个字节)、int8(占一个字节)、int16(占两个字节)、int32(占4个字节)、int64(占8个字节)

    • uint(无符号整数)、uint8、uint16、uint32、uint64、uintptr

    • byte // uint8 的别名

    • rune // int32 的别名 代表一个 Unicode 码

    • float32、float64

    • complex64、complex128

    有符号和无符号的区别:int8 范围 -128-127,uint8 范围:0-255

    当一个变量被声明之后,系统自动赋予它该类型的零值:

    int 为 0float 为 0.0bool 为 falsestring 为空字符串指针为 nil

    所有的内存在 Go 中都是经过初始化的。

    package main
    
    import "fmt"
    
    var age int
    func main() {
      fmt.Println(age);
    }
    

    三、自增、指针

    3.1:自增

    c里面有:I++ I-- ++I --I

    GO里面只有:I++ I-- 而且必须单独写一行

    3.2:指针

    go跟C一样里面也有指针。

    定义一个空指针:

    go语言在使用指针时,会使用内部的垃圾回收机制(gc :garbage collector)不需要开发人员手动释放内存。

    C语言不允许返回栈上的指针,但是go语言可以返回栈上的指针【因为他有垃圾回收机制】,

    程序会在编译的时候就确定了变量的分配位置。编译的时候,如果发现有需要的话,会将变量分配到堆上。(后面我们会讲到内存逃逸)

    package main
    
    import "fmt"
    
    func main() {
    	//可以返回栈上的指针,编译器在编译的这段代码的时候,会自动判断这段代码,将city分配到堆上。
    	result := test()
    	fmt.Println(*result)
    }
    
    //在c语言里面,我们在方法里定义了一个变量city,如果函数执行完了,是会释放掉这个变量。
    //那么就会返回一个空指针回去!
    //但是在go里面,让不会返回空指针,他会保存这个变量将栈上的指针进行返回(没用东西都是放到栈上)
    func test() *string {
    	city := "深圳"
    	ptr := &city
    	return ptr
    }
    

    变量、指针和地址三者的关系是,每个变量都拥有地址,指针的值就是地址

    当使用&操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用*操作符,也就是指针取值

    func main() {
    	// 指针与变量
    	var room int = 10  // room房间 里面放的 变量10
    	var ptr = &room  // 门牌号px  指针  0xc00000a0a8
    	fmt.Printf("%p\n", &room)  // 变量的内存地址 0xc00000a0a8
    	
    	fmt.Printf("%T, %p\n", ptr, ptr)  // *int, 0xc00000a0a8
    	
    	fmt.Println("指针地址",ptr)   // 0xc00000a0a8
    	fmt.Println("指针地址代表的值", *ptr)  // 10
    }

    3.3:空指针

    • C 语言判断是不是空指针用 null
    • C++语言判断是不是空指针用 nullptr
    • go语言判断是不是空指针用 nil
    func main() {
    	name := new(string) //定义一个字符串的空指针
    	*name = "呵呵"
    	fmt.Println(name) //0xc000010230
    	if name != nil{
    		fmt.Println("name not nil")
    	}
    }

    四、go里面不支持的语法

  • 相关阅读:
    oracle使用expdp备份数据库
    用Setuptools构建和分发程序包
    C#5.0-原生异步编程方式
    任务并行库
    线程-线程池1
    多线程-3(同步)
    多线程-2(线程同步)
    线程---1
    高性能-GC3
    高性能-GC2
  • 原文地址:https://www.cnblogs.com/hero799/p/15950029.html
Copyright © 2020-2023  润新知