变量、类型、指针

目录:

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里面不支持的语法

 

posted @ 2022-03-01 14:29  你是我的神奇  阅读(46)  评论(0编辑  收藏  举报