#### Go 指针,标识符命名规范,关键字,运算符
回顾了一下之前写的文章,以及考虑到后期的内容较多, 从这篇开始逐渐增加文章内容;
这篇我们主要学习一Go 中的指针,标识符关键字以及运算符
##### 指针
介绍: Go 中的指针相比于C 中的指针,弱化了;基本数据类型,变量存储的是值,也称为值类型; 获取变量的地址,使用&: 例如: var a int, 获取a 的地址为: &a;
package main

import "fmt"

func main() {
var a int = 10
fmt.Println(a)
// 获取变量a 的地址
fmt.Printf("a address is %p\n",&a)//0xc000054080
// 基本数据类型a 在内存中的布局
// 变量a指向10, 10 的内存地址为: 0xc000054080
}

  


指针类型: 指针变量存储的是一个内存地址,这个内存地址指向的空间存的才是值;
如var b *int = &a
获取指针类型所指向的值使用\*;
如: var b \*int , 使用\*b 获取b 指向的值;
通过指针更改基本类型的值;
如: var b \*int, 使用*b = 20, 来更改基本类型的值;
package main

import "fmt"

func main() {
var a int = 10
// 变量 b 是一个指针变量,类型为*int
var b *int = &a
// 内存布局如下:
// 变量a指向10, 10 的内存地址为: 0xc000054080
// 指针变量b 指向0xc000054080, 0xc00054080 地址指向10
fmt.Printf("a address is %p\n") //0xc000054080
fmt.Printf("b value is %p\n") //0xc000054080
fmt.Println("b pointed value is",*b) //10
// 通过指针更改变量的值,并不会改变原来的内存地址
*b = 100
fmt.Println("a value is",a)//100
}

  


指针使用的细节
1. 值类型都有对应的指针类型,形式为\*数据类型, 如int 类型的对应指针是*int,int32类型的对应指针为*int32;
2. ***指类型包括:基本数据类型int系列,float系列,bool,string;数组和结构体struct***
##### 值类型和引用类型
值类型:***指类型包括:基本数据类型int系列,float系列,bool,string;数组和结构体struct***
引用类型: 指针,slice 切片, map, 管道chan,接口interface都是引用类型;
1. 值类型: 变量直接存储的值,内存通常在栈中分配
2. 引用类型: 变量存储的是一个内存地址,这个地址指向的空间才真正存储的值,内存通常在堆上分配,如果没有任何变量引用这个地址时,该地址对应的
数据空间就成为一个垃圾,由GC 来回收
var a = 100
// a --> 100
var b = &a
// b --> 地址 --> 100

  


##### 标识符及命名规范
Go 对各种变量,方法,函数等命名时使用的字符序列称为标识符;
也可以这样说: 凡是程序员可以自己起名称的地方都叫标识符;
规则:
1. 由26 个英文字母大小写,0-9,_ 组成 ;
2. 数字不可以开头;
3. 严格区分大小写;
4. 标识符不能包含空格;
5. 不能使用系统保留的关键字作为标识符;
6. ***下划线_本身在Go中是一个特殊的标识符,称为空标识符,它可以代表任意的其它字符,但是它的值会被忽略
单一_仅能被作为占位符使用,不能作为标识符使用;***
7. 除了第6条外,与其它语言基本规则一样,在命名时注意即可;
---
标识符命名注意事项
1. 包名: 保持package 的名字和目录的名称一致,尽量采用有意思的名称,最好不和标准库冲突;
2. 变量名,函数名,常量名采用驼峰命名法;
3. 如果变量名,函数名,常量名首字母大写,则可以被其它的包访问,如果首字母小写,则只能在本包中使用(首字母大写是公开的,首字母小写是私有的,类似其它语言中的public,private 关键字)
##### 系统保留关键字(25个)

 
##### 预定义的标识符(36个)
包括基础数据类型和系统内嵌函数

 
##### 运算符
运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等;
1. 算术运算符
2. 赋值运算符
3. 比较运算符/关系运算符
4. 逻辑运算符
5. 位运算符
6. 其它运算符
---
##### 算术运算符
算术运算符是对数值类型的变量进行运算,如下:


案例:
package main

import "fmt"

func main() {
var a int = 10
var b int = 3
fmt.Println(a+b) //13
fmt.Println(a-b) //7
fmt.Println(a*b) //30
// 注意: 如果运算的数全是整数,那么结果保留整数部分
fmt.Println(a/b) //3
var c float64 = 10 / 3 // 3
// 如果需要保留小数部分,则需要浮点数参与运算
var d float64 = 10.0 / 3 // 3.333333...
fmt.Println(c,d)
// % 的使用
// a % b = a- a/b*b // 这是一个公式
fmt.Println("10 %3 = ",10%3) // 1
fmt.Println("-10 %3 = ",-10%3) //(-10)-(-10)/3*3 = -1
fmt.Println("10 %-3 = ",10%-3)//10-10/(-3)*(-3) = 1
fmt.Println("-10%-3 = ",-10%-3) // (-10)-(-10)/(-3)*(-3) = -1
var e = 1
e ++
fmt.Println(e) //2
e--
fmt.Println(e) //1
}

  


算术运算符使用的注意事项
1. 对于除号, 它的整数除和小数除是有区别的,整数除时只保留整数部分;
2. 取模时%, 可以参考公式: a%b = a-a/b*b;
3. Go 的自增和自减只能作为独立语句使用;
4. ++ 和 -- 只能写在变量后,没有--a,和++a;
---
##### 关系型运算符(比较运算符)
关系型运算符的结果都是bool 类型的,要么是true , 要么是false, 经常使用在条件控制语句中;

 
package main

import "fmt"

func main() {
var a = 1
var b = 2
fmt.Println(a>b) // false
fmt.Println(a<b) // true
fmt.Println(a==b) // false
fmt.Println(a!=b) // true
fmt.Println(a<=b) // true
fmt.Println(a>=b) // false
resu := a>b
fmt.Println(resu) // false
}

  


---
关系型运算符使用注意事项:
1. 运算结果都是bool 类型,true or false;
2. 比较运算符"==" 不能写成"=", "=" 是赋值 ;
##### 逻辑运算符
假如: a = true, b = false
a && b = false // 两边同时为true ,结果为true,否则为false
a || b = true // 两边同时为false ,结果为false,否则为true
!a = false, !b = true // 取反,!true=false, !false=true
案例:
package main

import "fmt"

func main() {
var a = 2
// 两边不同时为true, 结果为false
fmt.Println(a > 2 && a < 3) // false
// 两边同时为true,结果为true
fmt.Println(a >1 && a <3 ) // true
// 两边有一个为true,结果为true
fmt.Println(a >2 || a < 3) // true
// 两边同时为false,结果为false
fmt.Println(a >2 || a <1 ) // false
fmt.Println(a > 2) // false
// 取反
fmt.Println(!(a>2)) // true
}

  


---
逻辑运算符使用注意事项
1. && 也称为短路与: 如果第一个条件为false, 则第二个条件不会判断,结果为false;
2. || 也称为短路或: 如果第一个条件为true, 则第二个条件不会判断,结果为true;
package main

import "fmt"

func test() bool {
fmt.Println("hello,world")
return true
}
func main() {
var a = 2
if a < 1 && test() { // false , test() 函数不会执行
fmt.Println("yes")
} if a > 1 || test() { // true, test() 函数不会执行
fmt.Println("yes")
}
}

  


##### 赋值运算符
赋值运算符就是将运算后的值,赋值给指定的变量;
分类:
1. = , 如: a3 = a1 + a2
2. +=, 如: a3 += a1,等价于 a3 = a3 + a1
3. -=, 如: a3 -= a1,等价于 a3 = a3 - a1
4. *=, 如: a3 *= a1,等价于 a3 = a3 * a1
5. /=, 如: a3 /= a1,等价于 a3 = a3 / a1
5. %=, 如: a3 %= a1,等价于 a3 = a3 % a1
案例:
package main

import "fmt"

func main() {
var a1 = 1
var a2 = 2
a3 := a1 + a2
fmt.Println(a3)
a3 += a1 // a3 = a3 + a1 ====> 3+1
fmt.Println(a3) // 4
// 在这里演示一个小案例,用来体验一下Go 赋值运算符的使用
// 交换两个变量的值
var a = 10
var b = 20
// Go 中支持多变量赋值
a, b = b, a // 正确
fmt.Println(a, b) // 20,10
// 使用另一种方式实现
a = a + b
b = a - b // a +b -b = a
a = a - b // a +b -a = b
fmt.Println(a, b) //10,20 , 上面已经交换过,这里恢复
}

  


---
赋值运算符的使用注意事项
1. 运算顺序从右往左;
2. 赋值运算符的左边只能是变量,右边可以是变量,表达式,常量值;

##### 位运算符
位运算符涉及到二进制运算,实际使用过程中并不是太多,这里先不写......



##### 运算符的优先级
从高到低
1. (),++,--
2. 单目运算: !,&,*
3. 移位运算: <<,>>
4. 位运算: |,&,^
5. 算术运算: *,/,+,-
6. 关系型运算: >,<,<=,==,>=
7. 逻辑运算: &&,||
8. 赋值运算: +=,-=,*=
9. 逗号: ,
---
运算符的优先级,与其它编程语一样,不需要过多研究,实际使用中多写多练即可;

--------最近在同步更新微信公众号:"开胃咸菜",最新文章以公众号为准,可以一起学习交流;

												

Go 指针,标识符命名规范及关键字的更多相关文章

  1. 【Java学习笔记之二】java标识符命名规范

    什么是标识符 就是程序员在定义java程序时,自定义的一些名字.标识符可以应用在类名.变量.函数名.包名上. 标识符必须遵循以下规则 标识符由26个英文字符大小写(a~zA~Z).数字(0~9).下划 ...

  2. Day01_04_Java标识符命名规范

    Java标识符命名规范 什么是标识符? 在程序中程序员有权利自己命名的单词都是标识符(类名 方法名 变量名 常量名 接口名) 标识符命名规则 标识符用作给变量.类和方法命名 标识符以由大小写字母.数字 ...

  3. Java语言基本语法(一)————关键字&标识符(Java语言标识符命名规范&Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )

    一.关键字 关键字的定义和特点 定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词). 特点:关键字中所有字母均为小写 下面列举一些常用的关键字. 用于定义数据类型的关键字:byte.sho ...

  4. 8.Python标识符命名规范

    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量.函数.类.模块以及其他对象的名称. Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如 ...

  5. Python | 标识符命名规范

    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量.函数.类.模块以及其他对象的名称. Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如 ...

  6. C#代码标识符命名规范

    总体原则:命名一定要体现其在程序中的作用: Camel命名法:第一个单词的首字母小写,其余每个单词的首字母大写:多用给变量或者字段命名:给字段命名必须以下划线开始: Pascal命名法:每个单词的首字 ...

  7. Java基础入门 - 标识符及其命名规范

    类名.变量名.方法名都称为标识符 标识符命名规范: 由字母(A-Z或a-z).数字.下划线(_)和美元符($)中的一种或多种组合而成 不可以数字开头 大小写敏感 关键字不能用作标识符 合法标识符如:D ...

  8. 【Java】标识符 & 命名规则

    Java的标识符和命名规则 什么是标识符[Identifier]? 指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在编程语言中,标识符是开发者编程时使用的名字,对于变量.常量.函数. ...

  9. Java基础—标识符及命名规范

      什么是标识符符? 凡是可以由自己命名的地方都称为修饰符. 例: 项目名 ,包名 ,类名 .方法名 2.   命名规范. ①    不可使用java关键字和保留字,但是可以包含关键字和保留字. ②  ...

随机推荐

  1. Linux(centos)使用nc命令发送测试数据

    安装 yum -y install nmap-ncat 简单使用 nc -lk 7777 # 开启一个本地7777的TCP协议端口,由客户端主动发起连接,一旦连接必须由服务端发起关闭 nc -vw 2 ...

  2. c++设计模式概述之备忘录

    代买写的不够规范,,目的是缩短篇幅,实际中请不要这样做. 1.概述 和这个模式相似的生活场景,比如 office的撤销操作.VS  和 xcode等IDE的撤销操作 . 其实都是恢复到上一个或者下一个 ...

  3. libevent之学习文档

    1.官方文档 2.中文版 3.gitbook

  4. 1025 - The Specials Menu

    1025 - The Specials Menu    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  5. react hooks 如何自定义组件(react函数组件的封装)

    前言 这里写一下如何封装可复用组件.首先技术栈 react hooks + props-type + jsx封装纯函数组件.类组件和typeScript在这不做讨论,大家别白跑一趟. 接下来会说一下封 ...

  6. Generative Modeling by Estimating Gradients of the Data Distribution

    目录 概 主要内容 Langevin dynamics Score Matching Denoising Score Matching Noise Conditional Score Networks ...

  7. 图像处理opencv-Rect 排序、合并[转]

    opencv进行rect检测时,当检测到多个rect,组成rect vector之后,有些rect是由一个区域误分割得到的, 可以按照某种规格将这些rect合并为一个rect.比如按照x,y,widt ...

  8. Reflection 基础知识(一)

    反射机制的定义 反射通常指在程序在运行时能够获取自身的信息. 静态语言反射 在java中使用反射的一个例子 Class<?> clazz = Class.forName("com ...

  9. JUC之集合中的线程安全问题

    集合线程安全问题 JDK Version:9 首先说下集合线程安全是什么:当多个线程对同一个集合进行添加和查询的时候,出现异常错误. 复现例子: package com.JUC; import jav ...

  10. MySQL百分比显示和显示前百分之几的方法

    前几天一个朋友让我帮忙写的,随手记录一下,感觉难度也不大,就是写的时候遇到一些问题.优化方便做得不太好.有好的优化方法欢迎分享!(数据库在文章结尾) 要求 1)查询所有时间内,所有产品销售金额占比,按 ...