Go语言的转译字符(escape char)

常见转义字符列表

转义字符

说明

示例

\n

换行(Newline)

fmt.Println("Hello\nWorld") → 输出两行

\t

水平制表符(Tab)

fmt.Println("Name:\tAlice") → Name: Alice

\\

反斜杠本身

fmt.Println("C:\Go\bin") → C:\Go\bin

\"

双引号

fmt.Println("He said, \"Hi\"") → He said, "Hi"

\'

单引号(仅用于 rune 类型)

'\'' → 单引号字符

\r

回车(Carriage Return)

光标回到行首(Windows换行是 \r\n

\b

退格(Backspace)

删除前一个字符

\f

换页(Form Feed)

打印机换页,终端可能无效果

\a

响铃(Alert/Bell)

终端可能发出“叮”声

\v

垂直制表符(Vertical Tab)

较少使用

\0

垂直制表符(Vertical Tab)

字符串结束标志(C风格,Go 较少用)

package main
import "fmt" 
func main() {
    //演示转义字符的使用 \t
    fmt.Println("Hello:\tWorld!")
    fmt.Println("Hello\nWorld!")
    fmt.Println("C:\\Go\\bin")
    fmt.Println("tom say\"i love you\"")
    fmt.Println("疯狂星期四\r请v我50")
}
​
运行结果如下
#go run .\main.go
Hello:  World!
Hello
World!
C:\Go\bin
tom say"i love you"
请v我50期四

课堂练习

要求:请使用一句输出语句,达到输入以下效果

姓名

年龄

籍贯

住址

阿昆

34

北京

没座

package main
import "fmt"
func main() {
    fmt.Println("姓名\t年龄\t籍贯\t住址\n阿昆\t34\t北京\t没座")
}

image-20250522231737309

编译命令

go build .\practice01.go
生成一个二进制的可执行文件practice01.exe
可直接运行可执行文件 .\practice01.exe
#如下
PS L:\goproject\src\go_code\chapter02\escape char\practice01> ls
​
    Directory: L:\goproject\src\go_code\chapter02\escape char\practice01
​
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2025/6/10    23:23        2303488 practice01.exe        
-a---           2025/6/10    23:19            424 practice01.go
​
PS L:\goproject\src\go_code\chapter02\escape char\practice01> .\practice01.exe
  *                       * 
*     * I Love Golang *     *
  *                       *
    *                   *
      *               *
        *           *
          *       *
            *   *
              *

Golang程序编写的规则

  • go文件的后缀.go

  • go程序区分大小写

  • go的语句后,不需要带分号

  • go定义的变量,或者import包,必须使用,如果没有使用就会报错

  • go中,不要把多条语句放在同一行。否则报错

  • go中的大括号成对出现,而且风格

占位符

常用

  • 详细参考fmt库的内容

占位符

介绍

%d

数字

%p

内存地址

%s

字符串

\n

换行

%t

布尔

%T

类型

%f

浮点数

%.1f

保留两位小数

变量(var)

变量的定义

Go语言是静态累消类型的语言,就是所有的类型我们都需要明确的去定义。

在Go语言中,我们声明一个变量一般是使用var关键字:

var name type
  • 第一个 var 是声明变量的关键字,是固定的写法,你要声明一个变量,就需要一个 var。

  • 第二个 name ,就是我们的变量名字,你可以按照自己的需求给它定一个名字。用来后续使用!

  • 第三个 type ,就是用来代表变量的类型。

举个栗子:

// 定义一个字符串变量,name
var name string
​
// 定义一个数字类型变量 age
var age int

如果你学过Java、C或者其他编程语言,第一次看到这样的操作肯定不舒服。Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b;。其中只有a是指针而b不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在Go中,则可以和轻松地将它们都声明为指针类型:

var a, b *int

变量的命名规则遵循驼峰命名法,即首个单词小写,每个新单词的首字母大写,例如:userFiles和systemInfo。

变量定义的标准格式为

var 变量名 变量类型

变量声明以关键字var开头,后置变量类型,行尾无须分号。

我们有时候会批量定义变量,如果每次都单独定义比较麻烦,Go语言支持批量定义变量

使用关键字var和括号,可以将一组变量定义放在一起。

var (
    addr string
    phone string
)

var形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。

当一个变量被声明之后,如果没有显示的给他赋值,系统自动赋予它该类型的默认值:

  • 整型和浮点型变量的默认值为 0 和 0.0。

  • 字符串变量的默认值为空字符串。

  • 布尔型变量默认为 false。

  • 切片、函数、指针变量的默认为 nil。

  • go语言默认零值可用 -- 定义可以不用赋值但必须使用。

变量的初始化

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。

变量的使用步骤

  1. 声明变量(也叫:定义变量)

  2. 非变量赋值

  3. 使用变量

快速入门案例

package main
import "fmt"
func main() {
	//定义变量
	var i int
	//给i赋值
	i = 10
	//打印i的值
	fmt.Println("i的值为:", i)
}
// 演示变量的声明和初始化

变量使用注意事项

  1. 变量表示内存中的一个存储区域。

  2. 该区域有自己的名称(变量名)和类型(数据类型)。

  3. Golang变量初始化的三种方式:

    • 第一种:指定变量类型,声明后若不赋值,使用默认值。

    • package main
      import "fmt"
      func main() {
      //int的默认值是0,其它数据类型的默认值上面有介绍
      var i int
      fmt.Println("i=", i)
      }

    • 第二种:根据值自行判定变量类型(类型推导)。

    • var num = 10.11
      fmt.Println("num=", num)

    • 第三种(短变量声明并初始化):省略var,

      注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误no nqw variables on left side of :=

    • //下面的方式等价var name string name ="tom"
      //:= 的 :不能省略,否则错误
      name := "tom"
      fmt.Println("name=", name)

      //:= 自动推导
      //以下演示:= 自动推导变量类型
      package main
      
      import "fmt"
      
      func main() {
      	name := "deadline"
      	age := 18
      
      	fmt.Println(name, age)
      	fmt.Printf("%T,%T", name, age)
      	//%T表示type(类型)
      }
      
      // 以上代码演示了如何声明变量并输出其值和类型
      // name 和 age 是变量,分别存储字符串和整数类型的值
      // fmt.Println(name, age) 输出变量的值
      // fmt.Printf("%T,%T", name, age) 输出变量的类型
      // %T 是格式化动词,用于输出变量的类型
  4. 多变量声明

    • 在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法。

    • package main
      import "fmt"
      func main() {
      //该案例演示golang如何一次性声明多个变量
      var n1, n2, n3 int
      fmt.Println("n1=", n1, "n2=", n2 ,"n3=", n3)
      //一次性声明多个变量的方式2
      var n4, name, n5 = 100, "tom", 888
      fmt.Println("n4=", n4, "name=", name, "n5=", n5)
      //一次性声明多个变量的方式3,同样可以使用类型推导
      n6, name01, n7 := 100, "tom~", 888
      fmt.Println("n6=", n6, "name01=", name01, "n7=", n7)
      }
      // 注意:在Go语言中,变量声明后如果没有赋值,则会使用默认值,int类型的默认值为0,string类型的默认值为" "
      // 另外,Go语言支持多变量声明和类型推导,可以在一行中声明多个变量并赋值,使用:=语法。

      //运行结果如下
      PS L:\goproject\src\go_code\chapter03\variable02\main> go run .\variable_demo02.go
      n1= 0 n2= 0 n3= 0
      n4= 100 name= tom n5= 888
      n6= 100 name01= tom~ n7= 888

      如何一次性声明多个全局变量【在go中函数外部定义变量就是全局变量】:

      package main
      import "fmt"
      //定义全局变量
      var n1 = 100
      var n2 = 200
      var name = "Batman"
      //上面的定义方式也可改为一次性声明
      var (
          n3 = 300
          n4 = 400
          name1 = "Joker"
      )
      func main() {
      	fmt.Println("n1=", n1, "name=", name, "n2=", n2)
          fmt.Println("n3=", n3, "name1=", name1, "n4=", n4)
      }
  5. 该区域的数据值可以在同一类型范围内不断变化。

  6. 变量在同一个作用域内不能重名。

  7. 变量=变量名+值+数据类型。

  8. Golang的变量如果没有赋初值,编译器会使用默认值,比如int默认值为0、string默认值为空

理解变量(内存地址)

package main
import "fmt"
func main() {
	var num int
	num = 1000
	fmt.Printf("num的值为: %d\n,内存地址为:%p\n", num, &num)
	//取地址符 &变量名
	num = 2000
	fmt.Printf("num的值为: %d\n,内存地址为:%p\n", num, &num)
}

变量交换

package main
import "fmt"
/*
	在编程中,最简的算法就是变量的交换了,但是我们一般常见的方式就是定义中间变量
	var a int = 100
	var b int = 200
	var t int
	t = a
	a = b
	b = t
	fmt.Println(a, b)
*/

func main(){
	var a int = 100
	var b int = 200
	// 在 Go 语言中,可以直接这样来实现换值,不需要中间变量了。
	b, a = a, b
	fmt.Println(a, b)
}

匿名变量

匿名变量的特点是一个下划线__本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋值给这个标识符的值都将被抛弃,因此这些值不能在后续代码中使用,也不可以使用这个标识符作为变量对其他变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下划线_替换即可。例如:

package main
import "fmt"
/*
	定义一个test函数,它会返回两个int类型的值,每次调用将会返回 100 和 200 两个数值。
	这里我们先不用管 函数的定义,后面会讲解,
	我们用这个函数来理解_这个匿名变量。
*/
func test() (int, int) {
	return 100, 200
}
func main(){
    a, _ := test()
    _, b := test()
	fmt.Println(a,b)	// 输出的结果为 100,200。
    
	//在第一行代码中,我们只需要获取第一个返回值,所以第二个返回值定义为匿名变量
	//在第二行代码中,我们只需要获取第二个返回值,所以第一个返回值定义为匿名变量,
}

在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的。但有时这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。

匿名变量不占用内存空间,不会分配内存。匿名变量之间也不会因为多次声明而无法使用。

变量的作用域

一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。

了解变量的作用域对我们学习Go语言来说是比较重要的,因为Go语言会在编译时检查每个变量是否使用过,一旦出现未使用的变量,就会报编译错误。如果不能理解变量的作用域,就有可能会带来一些不明所以的编译错误。

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。

package main
import "fmt"
func main() {
	//声明局部变量 a 和 b 并赋值
	var a int = 100
	var b int = 200
	//声明局部变量 c 并赋值为 a + b
	c := a + b
	//输出变量 a, b 和 c 的值
	fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

全局变量

在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用import关键字引入全局变量所在的源文件之后才能使用这个全局变量。

注:全局变量声明必须以var关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

package main
import "fmt"
var c int // 声明全局变量 c
func main() {
	// 声明局部变量 a 和 b
	var a, b int
	//初始化参数
	a = 100
	b = 200
	c = a + b // 使用全局变量 c 存储 a 和 b 的和
	// 在 Go 语言中,局部变量可以直接使用全局变量
	// 这里的 c 是全局变量,a 和 b 是局部变量
	// 声明局部变量 c 并赋值为 a + b
	fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的眉部变量会被优先考虑。

package main
import "fmt"
var a float32 = 3.14
func main() {
    //声明局部变量
    var a int = 3
    fmt.Printf("a = %d\n", a)
}

常量(const)

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型

const identifier [type] = value

你可以省略类型说明符[type],因为编译器可以根据变量的值来推断其类型。

  • 显式类型定义:const b string = "abc"

  • 隐式类型定义:const b = "abc"

多个相同类型的声明可以简写为:

const c_name1, C_name2 = value1, value2

以下实例演示了常量的应用: 常量的定义:const

package main
import "fmt"
func main() {
	const URL string = "https://www.haloyang.top/" //显式定义
	const URL2 = "https://www.haloyang.top/"       //隐式定义

	const a, b, c = 3.14, false, "hello" //多重赋值
	fmt.Println(URL, URL2, a, b, c)
	fmt.Printf("%T, %T, %T, %T, %T\n", URL, URL2, a, b, c) // 输出变量的类型
}

特殊常量(iota)

iota,特殊常量,可以认为是一个可以被编译器修改的常量。iota是go语言的常量计数器

iota 在 const 关键字出现时将被重置为0(const内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次( iota 可理解为 const 语句块中的行索引)。

iota 可以被用作枚举值:

const (
	a = iota
    b = iota
    c = iota
)

第一个 iota 等0,每当iota在新的一行被使用时,它的值都会自动加 1;所以 a=0,b=1,c=2 可以简写为如下形式:

const (
    //一组常量中,如果某个常量没有初始值,默认和上一行一致。
	a = iota
    b
    c
)

例子:

package main
import "fmt"
func main() {
	const (
		a = iota     //0		iota 0
		b            //1		iota 1
		c            //2		iota 2
		d = "kunkun" //kunkun	iota 3
		e            //kunkun	iota 4
		f = 100      //100		iota 5
		g            //100		iota 6
		h = iota     //7		iota 7
		i            //8		iota 8
	)
	const (
		j = iota 	//0			iota 0
		k        	//1			iota 1
	)
	fmt.Println(a, b, c, d, e, f, g, h, i, j, k)
	fmt.Printf("%T, %T, %T, %T, %T, %T, %T, %T, %T, %T,%T\n", a, b, c, d, e, f, g, h, i, j, k)
	// 输出变量的值和类型
}

基本数据类型(type)

Go语言是一种静态类型的编程语言,在Go编程语言中,数据类型用于声明函数和变量。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。编译器在进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

基本数据类型

布尔型(bool)

布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。

package main
import "fmt"
func main() {
	// var isFlag bool
	// var isFlag2 bool

	// isFlag = true
	// isFlag2 = false
    
	var isFlag bool = true	//不赋值的则默认为false
	var isFlag2 bool = false

	fmt.Printf("%T,%t\n", isFlag, isFlag)
	fmt.Printf("%T,%t\n", isFlag2, isFlag2)
}

数字型(int、float)

整型 int 和浮点型 float32、float64,Go语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。

Go也有基于架构的类型,例如:uint无符号、int有符号

类型

描述

uint8

无符号 8 位整型(0到255)

uint16

无符号 16 位整型(0到65535)

uint32

无符号 32 位整型(0到4294967295)

uint64

无符号 64 位整型(0到18446744073709551615)

int8

有符号 位整型(-128到127)

int16

有符号 16 位整型(-32768 到 32767)

int32

有符号 32 位整型(-2147483648到2147483647)

int64

有符号 64 位整型(-9223372036854775808到9223372036854775807)

func main(){
    var i1 int8
	var i2 uint8
	i1 = 100
	i2 = 200
	fmt.Println(i1)
	fmt.Println(i2)
}

浮点型

类型

描述

float32

IEEE-754 32位浮点型数

float64

IEEE-754 64位浮点型数

complex64

32 位实数和虚数

complex128

64 位实数和虚数

func main(){
    var f1 float32
	f1 = 3.14
	var f2 float64
	f2 = 5.12
	// %f默认保留小6位数,'.2f%'就是保留2位,'.3f%'就是保留3位
	fmt.Printf("%T,%.3f\n",f1,f1)
	fmt.Printf("%T,%f\n",f2, f2)
}

1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位 2、尾数数部分可能丢失,造成精度损失。-123.0000901

package main
import "fmt"
func main() {
	var num1 float32 = -123.0000901
    //尽量使用float64来定义浮点类型的小数(golang默认也是float64)
	var num2 float64 = -123.0000901
	fmt.Println("numl = ", numl, "num2 =", num2)
}
  • 说明:float64的精度要比float32的要准确

  • 说明:如果我们要保存一个精度高的数,则应该选择float64

3、浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失 4、golang的浮点型默认为float64类型 5、通常情况下,应该使用float64,因为它比float32更精确

以下列出了其他更多的数字类型:

类型

描述

byte

类似 uint8

rune

类似 int32

uint

32 或 64 位

int

与 uint一样大小

uintptr

无符号整型,用于存放一个指针

字符串类型(string)

字符串就是一串固定长度的字符连接起来的字符序列。

Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。

func main() {
	var str string
	str = "Hello,World"
	fmt.Printf("%T,%s\n",str, str)
	//单引号和双引号区别,单引号字符,ascii字符码
	v1 := 'A'	//int32,65
	v2 := "A"	//string,A
	fmt.Printf("%T,%d\n", V1, V1)
	fmt.Printf("%T,%s \n", v2, v2)
	//扩展知识:
	//中国的编码表:GBK
	//Unicode编码表:号称兼容了全世界的文字
	v3 := '中'	//int,20013
	fmt.Printf("%T,%d\n", v3, v3)
}

Go语言的字符串连接可以通过+实现:

fmt.Println("Kun" + "kun")

转义字符(详见第一章):

/转义双引号
fmt.Println("\"hello,world\"")
/*
\b	backspace
\t	tab
\n	newline
*/

数据类型转换

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:

valueOfTypeB = typeB(valueOfTypeA)

类型B的值 = 类型B(类型A的值)

func main() {
	a := 5.0		//float
	b := int(a)	//转为int

	fmt.Printf("%T,%f\n", a, a)
	fmt.Printf("%T,%d\n", b, b)
}

类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将 int16 转换为 int32 )。当从一个取值范围较大的类型转换到取值范围较小的类型时(将 int32 转换为 int16 或将 float32 转换为 int ),会发生精度丢失(截断)的情况。

运算符(operators)

  • 算术运算符

  • 关系运算符

  • 逻辑运算符

  • 位算符

  • 赋值运算符

  • 其他运算符

算术运算符(Arithmetic)

下表列出了所有Go语言的算术运算符。假定 A 值为10,B 值为20。

运算符

描述

实例

+

相加

A + B 输出结果 30

-

相减

A - B 输出结果 -10

*

相乘

A * B输出结果 200

/

相除

B / A输出结果 2

%

求余(取模)

B % A输出结果 0

++

自增

A++ 输出结果 11

--

自减

A-- 输出结果 9

package main

import "fmt"

func main() {
	var a int = 10
	var b int = 20
	//var c int

	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a / b) // 注意:在 Go 语言中,除法操作会进行整数除法
	// 如果需要浮点数除法,需要将其中一个操作数转换为浮点数类型, 0
	fmt.Println(float64(a) / float64(b)) // 浮点数除法, 0.5
	fmt.Println(a % b)                   // 取余操作, 10
	a++	//a = a + 1, 11
	fmt.Println(a)
	a--	//a = a - 1, 10
	fmt.Println(a)
	a--	//a = a - 1, 9
	fmt.Println(a)
}

关系运算符(Relationa)

下表列出了所有Go语言的关系运算符。假定A值为10,B值为20。

运算符

描述

实例

==

检查两个值是否相等,如果相等返回True否则返回False。

(A == B) 为 False

!=

检查两个值是否不相等,如果不相等返回True否则返回False。

(A! = B) 为 True

>

检查左边值是否大于右边值,如果是返回True否则返回False。

(A > B) 为 False

<

检查左边值是否小于右边值,如果是返回True否则返回False。

(A < B) 为 True

>=

检查左边值是否大于等于右边值,如果是返回True否则返回False。

(A >= B) 为 False

<=

检查左边值是否小于等于右边值,如果是返回True否则返回False。

(A <= B) 为 True

package main
import "fmt"
func main() {
	var a int = 10
	var b int = 20

	// 关系运算符
	fmt.Println(a == b) // 相等
	fmt.Println(a != b) // 不相等
	fmt.Println(a > b)  // 大于
	fmt.Println(a >= b) // 大于等于
	fmt.Println(a < b)  // 小于
	fmt.Println(a <= b) // 小于等于

	// 使用 if 语句结合关系运算符
	// 相等
	if a == b {
		fmt.Printf("a 等于 b\n")
	} else {
		fmt.Printf("a 不等于 b\n")
	}

	// 不相等
	if a != b {
		fmt.Println("a 不等于 b\n")
	} else {
		fmt.Println("a 等于 b\n")
	}
	
	// 小于,不小于
	if a < b {
		fmt.Println("a 小于 b\n")
	} else {
		fmt.Println("a 不小于 b\n")

	}

	// 大于,不大于
	if a > b {
		fmt.Println("a 大于 b\n")
	} else {
		fmt.Println("a 不大于 b\n")
	}

	// 大于等于
	if a >= b {
		fmt.Println("a 大于等于 b\n")
	} else {
		fmt.Println("a 小于等于 b\n")
	}

	// 小于等于
	if a <= b {
		fmt.Println("a 小于等于 b\n")
	} else {
		fmt.Println("a 大于等于 b\n")
	}
}

逻辑运算符(Logical)

下表列出了所有Go语言的逻辑运算符。假定A值为True,B值为False。

运算符

描述

实例

&&

逻辑AND运算符。如果两边的操作数都是True,则条件True,否则为False。

(A && B) 为 False

||

逻辑OR运算符。如果两边的操作数有一个True,则条件True,否则为False。

(A || B) 为 True

逻辑NOT 运算符。如果条件为True,则逻辑 NOT 条件 False,否则为 True。

!(A && B) 为 True

package main
import "fmt"
func main() {
	var a bool = true
    var b bool = false
    // 与:都为真,结果才为真,否则为假
    if a && b{
        fmt.Printf("第一行 - 条件为 true\n")
    }
    
    // 或:都为假,结果才为假,否则为真
    if a || b{
        fmt.Printf("第二行 - 条件为 true\n")
    }
    
    /*修改a 和 b 的值*/
    a = false
    b = true
    if a && b {
        fmt.Printf("第三行 - 条件为 true\n")
    }else {
        fmt.Printf("第三行 - 条件为 false\n")
    }
    
    // !取反:如果条件为真,结果为假;如果条件为假,结果为真
	if !(a && b) {
		fmt.Printf("第四行 - 条件为 true\n")
	} else {
		fmt.Printf("第四行 - 条件为 false\n")
	}
}

位运算符(Bitwise)

Go语言支持的位运算符如下表所示,假定A为60,B为13:

运算符

描述

实例

&

按位与运算符”&“是双目运算符。都是1结果为1,否则是0(AND)

(A & B)结果为 12,二进制为00001100

|

按位或运算符”|”是双目运算符。都是0结果为0,否是是1(OR)

(A | B)结果为 61,二进制位00111101

^

按位异或运算符”^”是双目运算符。不同则为1,相同为0(XOR)

(A ^ B)结果为 49,二进制位00110001

&^

位清空,a &^ b,对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0(ADN NOT)

(A &^ B)结果为 48,二进制位00110000

<<

左移运算符”<<是双目运算符。左移n位就是乘以2的n次方。其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<右边的数指定移动的位数,高位丢弃,低位补0。

A <<2 结果为 240,二进制为11110000

>>

右移运算符”>>”是双目运算符。右移n位就是除以2的n次方。其功能是把”>>”左边的运算数的各二进位全部右移若干位,">>”右边的数指定移动的位数。

A >>2 结果为 15,二进制为00001111

package main
import "fmt"
func main() {
	var a uint = 60 // 0011 1100
	var b uint = 13 // 0000 1101
	var c uint = 0  // 0000 0000

	c = a & b							// 按位与:0000 1100
	fmt.Printf("%d, 二进制为%b\n", c, c) // 输出: 12, 二进制为0000 1100

	c = a | b							// 按位或:0011 1101
	fmt.Printf("%d, 二进制为%b\n", c, c) // 输出: 61, 二进制为0011 1101

	c = a ^ b							// 按位异或:0011 0001
	fmt.Printf("%d, 二进制为%b\n", c, c) // 输出: 49, 二进制为0011 0001

	c = a << 2							// 左移:1111 0000
	fmt.Printf("%d, 二进制为%b\n", c, c) // 输出: 240, 二进制为1111 0000

	a = 60		// 重置a为60
	c = a >> 2							// 右移:0000 1111
	fmt.Printf("%d, 二进制为%b\n", c, c) // 输出: 15, 二进制为0000 1111
}

赋值运算符(Assignment)

下表列出了所有Go语言的赋值运算符。

运算符

描述

实例

=

简单的赋值运算符,将一个表达式的值赋给一个左值

C =A+B 将A+B表达式结果赋值给C

+=

相加后再赋值

C +=A 等于 C = C + A

-=

相减后再赋值

C -= A 等于C = C - A

*=

相乘后再赋值

C *= A 等于 C = C *A

/=

相除后再赋值

C /=A等于C = C / A

%=

求余后再赋值

C %= A 等于 C = C% A

<<=

左移后赋值

C <<= 2 等于 C = C << 2

>>=

右移后赋值

C >>= 2 等于 C = C >> 2

&=

按位后赋值

C &= 2 等于 C = C & 2

^=

按位或后赋值

C ^= 2 等于 C = C ^ 2

|=

按位后赋值

C|= 2 等于 C = C | 2

package main
import "fmt"
func main() {
	var a int = 10 // 声明并初始化变量a
	var b int = 20 // 声明并初始化变量b

	// 使用赋值运算符将b的值赋给a
	a = b
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 20

	// 使用加法赋值运算符将b的值加到a上
	a += b // a = a + b
	// 此时a的值为40,因为20 + 20 = 40
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 40

	// 使用减法赋值运算符将b的值从a中减去
	a -= b // a = a - b
	// 此时a的值为20,因为40 - 20 = 20
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 20

	// 使用乘法赋值运算符将a和b相乘
	a *= b // a = a * b
	// 此时a的值为400,因为20 * 20 = 400
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 400

	// 使用除法赋值运算符将a除以b
	a /= b // a = a / b
	// 此时a的值为20,因为400 / 20 = 20
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 20

	// 使用取模赋值运算符将a对b取模
	a %= b // a = a % b
	// 此时a的值为0,因为20 % 20 = 0
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 0

	// 使用左移赋值运算符将a左移2位
	a <<= 2                     // a = a << 2
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 0,因为0左移任何位数仍然是0

	// 使用右移赋值运算符将a右移2位
	a >>= 2                     // a = a >> 2
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 0,因为0右移任何位数仍然是0

	// 使用按位与赋值运算符将a和b进行按位与操作
	a &= b                      // a = a & b
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 0,因为0与任何数按位与仍然是0

	// 使用按位或赋值运算符将a和b进行按位或操作
	a |= b                      // a = a | b
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 20,因为0或20仍然是20

	// 使用按位异或赋值运算符将a和b进行按位异或操作
	a ^= b                      // a = a ^ b
	fmt.Printf("a的值为: %d\n", a) // 输出: a的值为: 0,因为20异或20结果是0
	fmt.Printf("所有赋值操作完成,最终a的值为: %d\n", a) // 输出: 所有赋值操作完成,最终a的值为: 0
}

其他运算符(指针)

运算符

描述

实例

&

返回变量存储地址

&a;将给出变量的实际地址。

*

指针变量

*a;是一个指针变量

package main
import "fmt"
func main() {
	var a int = 4
	var b int32
	var c float32
	var ptr *int

	/* 运算符实例 */
	fmt.Printf("第1 行- a变量类型为= %T\n", a)
	fmt.Printf("第2 行- b变量类型为= %T\n", b)
	fmt.Printf("第3 行- c变量类型为= %T\n", c)

	/* &和 *运算符实例 */
	ptr = &a /*'ptr′包含了'a'变量的地址*/
	fmt.Printf("a 的值为 %d\n", a)
	fmt.Printf("ptr 的值为 %p\n", ptr)
	fmt.Printf("*ptr 的值为 %d\n", *ptr) /*使用*运算符访问ptr指向的值*/
}

拓展:键盘输入输出(简易计算器)

package main
import (
	"fmt"
) 
func main() {
	/**
	 * 计算器程序
	 * 该程序实现了基本的加、减、乘、除运算
	 * 用户可以输入两个数字和一个运算符,程序将输出计算结果
	 */
	var num1, num2 float64
	var operator string
	fmt.Println("欢迎使用计算器!")
	fmt.Print("请输入第一个数字: ")
	fmt.Scanln(&num1)
	fmt.Print("请输入第二个数字: ")
	fmt.Scanln(&num2)
	fmt.Print("请输入运算符 (+, -, *, /): ")
	fmt.Scanln(&operator)
	switch operator {
	case "+":
		result := num1 + num2
		fmt.Printf("结果: %.2f + %.2f = %.2f\n", num1, num2, result)
	case "-":
		result := num1 - num2
		fmt.Printf("结果: %.2f - %.2f = %.2f\n", num1, num2, result)
	case "*":
		result := num1 * num2
		fmt.Printf("结果: %.2f * %.2f = %.2f\n", num1, num2, result)
	case "/":
		if num2 != 0 {
			result := num1 / num2
			fmt.Printf("结果: %.2f / %.2f = %.2f\n", num1, num2, result)
		} else {
			fmt.Println("错误: 除数不能为零!")
		}
	default:
		fmt.Println("错误: 无效的运算符!")
	}
}