带着问题学go ~~~ 变量

什么是标识符?

  • 说白了,就是你自己定义名称,比如:常量名,函数名,方法名。
  • 基本大部分编程语言的规定都是:字母,数字,下划线,并且不能以数字开头。
  • 而且最好是要区分大小写,比如 name,Name 是不同的。

什么是关键字?

说白了,就是编程语言自身要用的名称,你就不能用它们做名称了。

25个关键字

var   // 声明变量   var name string

type  // 定义一种数据类型, type Dog struct{}  定义了Dog这种结构体类型

const // 声明常量  const PI = 3.1415926

package // 包声明  package main

import // 导入包   import "fmt"

func   // 声明函数,  func add(x, y int) int {return x + y}

struct // 声明结构体中使用  type Cat struct{Name string, Cate string}

map  // map数据结构  m1 := make(map[int]string, 10)

interface // 接口声明中使用,接口是一种抽象的数据类型  type Animal interface {say()}

if else  // 条件语句 weekDay := int(time.Now().Weekday()); if weekDay >= 5 {fmt.Printf("周%d快乐\n", weekDay)} else {fmt.Printf("周%d要上班\n", weekDay)}

switch case default fallthrough // 分支结构相关
    weekDay := time.Now().Weekday()
    switch weekDay {
    case 1
        fallthrough
    case 2
        fallthrough
    case 3
        fallthrough
    case 4
        fmt.Println("上班ing")
    case 5
        fmt.Println("要放假了")
    default:
        fmt.Println("假期快乐")
    }

break // 跳出循环体
continue // 跳过当前循环
return // 中断执行,在函数中表示返回函数的结果到函数的调用处。
goto  // 跳到指定位置

range // 循环
    slice1 := []string{"a", "b", "c"}
    for idx, v := range slice1 {
        fmt.Printf("%d=>%v\n", idx, v)
    }

for // 循环
    for i := 1; i <= 10; i++ {
        fmt.Println(i)
    }

defer // 延迟执行,在函数确定了返回值之后,执行。
     file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close() // 确保文件在函数结束时被关闭

// chan 声明通道数据类型
    ch := make(chan int) // 创建一个int类型的通道
// select 同时处理多个通道的发送和接收,类似于异步监听
// go 启动一个goroutine

37个保留字

true  false  // 布尔类型的值
iota   // 常量自动生成
nil

int  int8  int16  int32  int64 intptr  // 整型
uint  uint8  uint16  uint32  uint64  uintptr  //无符号整型
float32  float64  //浮点类型 
complex128   complex64   // 复数类型
bool  // 布尔类型
byte // 字节类型,是uint8的别名
rune // 字符类型,是int32的别名
string // 字符串类型
error  // error类型

make() // 初始化 slice,map
len() // 求 数组,slice,map 的长度
cap() // 求数组,slice,map的容量
new() // 初始化值类型,并返回指针
append() // 追加切片元素
copy() // 复制切片
close() // 关闭通道
delete() // 删除map中指定的键值对
complex() // 创建复数
real() // 获取复数的实部
imag() // 获取复数的虚部
panic()  // 触发一个panic错误
recover() // 一般配合panic()使用,类似于try...catch 
    func test() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("恢复了:", r)
            }
        }
        fmt.Println("开始执行")
        panic("panic error")
        fmt.Println("这行不会被执行")
    }

变量是什么?

操作内存中的数据,是依托于内存地址的,但是如果直接在代码中,写地址操作数据,那就太麻烦了,而且还很容易出错。变量可以理解为编译器给地址取的别名。只要你声明了变量,编译器就会给其分配一个地址,没有初始值的话,变量的值就是其类型的零值。
[带着问题学go]之变量

var a int = 1
fmt.Printf("变量a对应的地址:%p\n变量a的值:%d\n", &a, a)
//变量a对应的地址:0xc00000a0c8
//变量a的值:1

为什么需要有变量类型?

其实就是为了内存开销,性能开销,比如存学生的年龄,我用uint8存储,肯定更合适,那就没必要int64了。
还有在运算时,go没有隐式类型转换,相同类型的才能运算,这也是为了减小系统开销。
同时固定了类型,我们的程序也会更健壮。当然,肯定没有php直接赋值来得舒服,go中也考虑到了,所以也有了简短声明 age := 18,但是要注意,这种简短方式,不能用在全局作用域下。

有哪些数据类型?

整型
浮点
复数
布尔
字符串

数组
切片
map
chan
指针

struct
interface

还可以用 type 自定义类型。

什么是声明变量?

  • 其实就是开辟内存空间,得到变量的地址。
  • 此时我们还没有给其一个具体的值,所以它的值默认是它类型的零值,整型是0,字符串是””, bool是false,浮点型是0,复杂类型一般都是nil。

声明变量怎么写?

var varname T
var (
    varname1 T
    varname2 T
    varname3, varname4 T  // 类型相同,可以一起写
)

作业:声明4个变量:姓名,年龄,金钱,上班没,爱好?

var (
    name, love string
    age uint8
    money float32
    isWorking false
)

怎么在同一行,声明多个不同类型的变量?

var name, age = "xqw", 18  // 不要显示给类型了,让go自己去推导
var (
    name string
    age int
)

什么是变量的初始化?

也就是在声明变量的同时,主动给其一个值(当然你不给,编译器会被动的给)。

怎么写?

var varname T = 值或表达式
var varname = 值或表达式   // 类型会自动推导
varname := 值或表达式  // 简短风格,不能在全局作用域下使用

var (
    varname1 T =  值或表达式
    varname2 =  值或表达式
)

作业:初始化变量:姓名,年龄,金钱,分数,上班没,爱好?

var name string = "junwind"
money := 100.21
var age, score = 18, 100
var (
    isWorking = true
    love = "看小说"
)

作业:声明两个变量a,b,并赋值为 “aaa”, 222,然后交换两个变量的值?

a, b := "aaa", 222
a, b = b, a

声明的变量一定非要使用吗?

  • 在函数内声明的,一定要使用。
  • 函数外,也就是全局作用域下声明的变量可以不使用。
  • 对于常量,函数内外声明后,都可以不使用。

什么是匿名变量 _ ?

说白了,就是一个占位符,将不要的数据赋值给它,它就像一个数据黑洞,类似 Linux 的 /dev/null
使用它时,它是不会分配内存的。并且不会造成重复赋值的问题。
比如,有一个切片,在遍历时,不需要它的索引值:

for _, v := range []int{1,2,3} {
    fmt.Println(v)
}

导入一个包,怎么可以不使用它?

import _ "yourPackage"

其实目的是为了执行包的 init() 函数。

本作品采用《CC 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
躺平大叔 @ 躺平社区
文章
136
粉丝
15
喜欢
102
收藏
59
排名:274
访问:3.5 万
私信
所有博文
社区赞助商