golang

go语言特点:c语言编译执行方式以及弱化指针+python

文章中的示例代码可直接复制到自己的编辑器中运行

Dos基础命令

目录操作

#查看当前路径下文件
dir
#切换到其他盘
cd /d d:
#切换到当前盘的其他目录
cd 目录名\目录名		#相对路径
cd f:\目录名\目录名	#绝对路径
#切换到上一级
cd ..
#切换到根目录
cd \
#新建目录
md 目录名及其创建的路径
#新建多个目录
md 目录名及路径 目录名及其路径
#删除空目录
rd 需要删除的目录路径
#删除目录以及下面的子目录和文件,不带询问
rd /q/s 需要删除的目录路径
#删除目录以及下面的子目录和文件,带询问
rd /s 需要删除的目录路径

文件操作

#新建或追加内容到文件
echo 文件内容 > 文件路径以及新建或者想要追加内容的文件名
#复制文件
copy 原文件路径 目标文件路径(可进行文件的重命名)
#移动文件
move 原文件路径 目标文件路径(可进行文件的重命名)
#删除指定文件
del 要删除的文件路径
#删除所有.txt后缀的文件
del *.txt

其他指令

#清屏
cls
#退出dos
exit

其他知识点

vscode快捷键

alt+shift+f:全局整理格式

alt+shift+↓:复制一行

字节

一个字节8位2进制

程序种+的使用

  1. 当左右两边都是数值型时,则做加法运算
  2. 当左右两边都是字符串,则时将其拼接
package main
import "fmt"

func main() {
    //此处的输出结果为80
    fmt.Println(30 + 50)
    //此处的输出结果为hello world
    fmt.Println("hello " + "world")
}

Unicode码

Unicode只有一个字符集,中文、日文、韩文三种文字一齐占用了Unicode中0x3000到0x9FFF的部分。Unicode目前普遍采用的是UCS-2标准,它用两个字节来编码一个字符, 比如汉字”经”的编码是0x7ECF。因为字符码一般用十六进制来表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制即是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母”a”的Unicode编码是0x0061,对应的十进制是97,而”a”的ASCII编码是0x61,对应的十进制也是97,。实际上Unicode对汉字的支持与编码并不怎么好,这也是没办法的。简体汉字和繁体汉字加在一起总共有六七万个,而UCS-2最多只能表示65536个字符,所以Unicode只能通过排除一些几乎不用的汉字的方法以能够表达其余常用汉字,好在常用的简体汉字只有七千多个。为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,在这种规范下,大部分来自不同国家和地区的可读字符都可以被表达出来。

Golang官方变成指南

网页端指南网站:

围棋之旅 (go.dev)

(不推荐)API查询官方网址(API:应用程序编程接口,就是我们Go的包的各个函数)

Go Packages - Go Packages

(推荐)Golang标准库API文档(国内下载,访问速度比官方要快)

Go语言标准库文档中文版

调用包中的方法:包名.包中的函数名(需要传入的参数)

// 引入包:文件所在包
package main

//导入方法使用的包
import "fmt"

func main() {
	//使用fmt中的Println函数
	fmt.Println("hello,world!")
}

编译与运行

编译

编译:主要是将编写的代码编译为机器能识别的二进制码文件,在Windows上会生成一个.exe后缀的文件,在Linux下会生成一个绿色的可执行文件,若存在错误则会爆出有问题的行。

运行

运行的两种方式:

  • 直接运行生成的可执行Go程序,比如hello.exe
  • 通过运行工具fo run队员吗进行运行

常见问题及解决方法

找不到文件

问题描述:执行代码时报错:The system cannot find the file specified.

翻译出来为:系统找不到指定的文件

image-20240305110805069

解决发放:源文件名不存在或者写错,或者当前路径错误

语法错误

问题描述:提示语法错误例子:

# command-line-arguments
main\hello.go:9:6: undefined: fmt.Print1n

翻译为:

#命令行参数

main\hello.go:9:6:未定义:fmt.打印1n

其中第二行表示:出错的文件路径行数:列:出现的问题

主要看的为我上边高亮的内容

image-20240305111533934

解决方法:排查是否出现语法错误,比如拼错单词,大小写,大括号,引号,或者使用了中文输入法等

注释

介绍:主要用来对方法类异界代码进行描述,便于后期维护和他人阅读

分类:

  • 行注释(单行注释)
  • 块注释(多行注释)

注意:注释的内容是不会被程序编译的,对程序无影响

行注释

使用方法:// + 注释内容

推荐用来注释整个方法和语句

// 引入包:文件所在包
package main

//导入方法使用的包
import "fmt"

func main() {
	
	fmt.Println("hello,world!")		//输出hello,world!,需要注意的是需要导入对应的包,否则编译无法通过
}

块注释(多行注释)

使用方法:/ /

注意:块注释里不允许有块注释嵌套

/*
多
行
注
释
*/

// 引入包:文件所在包
package main

//导入方法使用的包
import "fmt"

func main() {
	
	fmt.Println("hello,world!")		//输出hello,world!,需要注意的是需要导入对应的包,否则编译无法通过
}

代码风格规范

正确的缩进和空白

  1. 使用tab操作,实现整体向右缩进,默认整体向右边移动,有时候用shift+tab整体左移
  2. 或者使用gofmt来进行格式化(vscode中使用alt+shift+f实现)终端中通过fofmt -w +go文件路径实现
  3. 运算符两边习惯性各加一个空格。比如:2 + 3 * 5

代码风格

//错误示范
package main
import "fmt"
func main() 
{		//Go语言不能将方法后边的大括号另起一行
    fmt.Println("hello,world")
}

//正确示范
package main
import "fmt"
func main() {		
    fmt.Println("hello,world")
}

go语言特点

弱化的指针

package main
import "fmt"

//此处num为变量
func test(num int) {
    num =20
	fmt.Println("num=", num)
}
//此处*num为指针
func test2(num2 *int) {
	//&num表述输出num2指针的内存地址,num2表示输出指针变量的值,*num2表示输出num2保存的内存地址对应的值
	fmt.Println("&num2=", &num2, "num2=", num2, "*num2", *num2)
}

func main() {
    fmt.Println(30 + 50)
    fmt.Println("hello " + "world")
	//定义指针变量
	var i *int
	//定义变量n
	n := 20
	//给指针变量赋值为n的内存地址
	i = &n
	//调用test函数
	test(50)
	//调用test2函数
	test2(i)
}

包的引入

引入包的概念,用于组织架构,Go语言的一个文件都要归属于一个包,而不能单独存在

注意:此处的包主要是当前.go后缀文件所在的文件夹

//归属的包的生命
package 归属的包的名字
//举例:归属于main的go文件
package main
//引入包
import "引入的包的名称"
//举例
import "fmt"

行长约定

一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅

//换行举例,使用goland编辑器的话goland会自动帮你加上
fmt.Println("hellehellehellehellehe",
            "llehellehellehellehellehelle",
            "hellehellehellehellehellehellehelle")

垃圾回收机制

垃圾回收机制,内存自动回收,不需要开发人员管理

天然并发(重要特点)

  1. 从语言层面支持并发,实现简单
  2. goroutime,轻量级线程,可实现大并发处理,高效利用多核
  3. 基于CPS并发模型实现

管道通讯机制

吸收管道通讯机制,形成Go语言特有的管道channel,通过管道channel,可以实现不通goroute质检的相互通信

函数返回多个值

//同时返回和与差,(n1 int, n2 int):此处为传参,(int int):此处为返回值
func getSumAndSub(n1 int, n2 int) (int int){
    sum := n1+n2	//go语句之后不需要写分号
    sub := n1-n2
    return sum , sub
}

切片slice、延时执行defer

切片类似于Java中的集合

延时执行指的是所有代码执行完以后在执行defer中的代码

开发工具

  1. VSCode:个人看法(需要安装各种插件)
  2. Sublime Text: 个人看法(适合用来查看单独的go文件)
  3. Vim:同上
  4. Emacs:即使编辑器又可以用在做集成开发环境
  5. eclipse:开发编辑器,但是需要安装go插件并进行配置
  6. goland:开发编辑器,教程视频介绍,但是是JetBrain公司的全家桶产品,相对来说更推荐这个(个人推荐)

VSCode的下载安装以及使用

下载安装

下载地址:VSCode

使用

创建工作区

  • 点击文件->打开文件夹

    image-20240304130819780

  • 创建并选择文件夹作为工作目录

    image-20240304131439613

VSCode搭建go语言环境

下载安装SDK

SDK:软件开发工具包,主要是提供给开发人员使用的,其中包含了对应开发语言的工具包

下载地址:

Go中文网 Go语言中文网 golang (p2hp.com)

Go官网

傻瓜式安装即可,安装路径不要有中文

配置环境变量

右键此电脑->属性->高级系统设置->环境变量->新建

image-20240304150032887

新建:GOROOT

  • 变量名:GOROOT
  • 变量值:SDK安装路径

image-20240304150322520

path添加SDK的bin路径如下

%GOROOT%\bin

如果使用上边配置验证不通过则使用绝对路径

image-20240304151424006

验证

桌面开启终端输入go version显示版本即表示环境变量配置成功如下图所示

image-20240304151941136

入门程序Hello World

开发工具:VSCode

  • 创建main文件夹以及hello.go文件

    image-20240304153726524

  • 安装编译运行的插件

    image-20240304154757867

  • 编写代码

    // 引入包:文件所在包
    package main
    
    //导入方法使用的包
    import "fmt"
    
    func main() {
    	//输出hello,world!,需要注意的是需要导入对应的包,否则编译无法通过
    	fmt.Println("hello,world!")
    }
  • 保存->右键点击Run Code运行代码

    保存后确保VSCode文件名后边没有白色点才算保存完成

    image-20240304155404196

Golang执行流程分析

两种执行流程:

  • .go文件先使用go build进行编译生成.exe或可执行文件然后运行.exe文件或可执行文件进行运行
  • go run:编译运行一步解决

两种执行流程区别:

  • 如果是先编译在运行生成的.exe文件即使将.exe文件移动到一台没有环境的电脑上仍然可以运行,使用go run命令则不可以
  • 使用go build编译时,编译器会将程序运行所需要的库文件包含在可执行文件中,所以可执行文件变大了很多

执行流程图如下

image-20240304161150960

Go语法注意点

  1. Go源文件以“go”为扩展名
  2. Go应用程序的执行入口时main()方法
  3. Go语言严格区分大小写
  4. Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
  5. Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一行,否则会报错
  6. go语言定义的变量或者import的包如果没有使用到,代码不能编译通过
  7. 大括号成对出现,缺一不可

Go转义字符

\t:一个制表符

image-20240304171524947

\n:换行符

image-20240304171959121

\\:一个\

image-20240304172254979

\“:一个“

image-20240304172546322

\r:一个回车根据版本可能是替换也可能是换行

我的是1.21.5版本效果为换行

image-20240304174224314

数据类型以及默认值

基本数据类型

字节相关

数值型

整数类型
  • 默认值:0

    uint类型为无符号类型

  • 分类:

    • int 范围:32位系统-231~231-1,64位系统-263~263-1 存储空间:32位系统4字节,64位系统8字节
    • int8 范围:-128~127 存储空间:1字节
    • int16 范围:-215~215-1 存储空间:2字节
    • int32 范围:-231~231-1 存储空间:4字节
    • int64 范围:-263~263-1 存储空间:8字节
    • uint 范围:32位系统0~232-1,64位系统0~264-1 存储空间:32位系统4字节,64位系统8字节
    • uint8 范围:0~255 存储空间:1字节
    • uint16 范围:0~216-1 存储空间:2字节
    • uint32 范围:0~232-1 存储空间:4字节
    • uint64 范围:0~264-1 存储空间:8字节
    • byte:与uint8等价,当要存储字符时选用byte
    • rune:与int32一样,表示一个Unicode码一般用来存储汉字
  • 使用细节:

    1. 在程序中查看某个变量的字节大小和数据类型

      package main
      
         //导入包的方法建议使用这种
      import (
      	"fmt"
      	"unsafe"
      )
      
         func main() {
      
         	//查看某个变量的占用字节和数据类型
      	var n int64 = 10
      	//使用fmt.Printf()用来做格式化输出,%T用来输出类型,%d用来输出占用字节,使用unsafe包下的Sizeof函数来获取变量占用字节数大小
      	fmt.Printf("n的类型 %T	n占用的字节数是 %d", n, unsafe.Sizeof(n))
      }
    2. Golang程序中整型变量在使用时,遵守报销不报答原则,即:在保证程序正常运行下,尽量使用占用空间小的数据类型。比如想要存储的数据范围在0-255那便使用unit8类型来保存,没必要定义更大的变量

    3. bit:计算机中的最小存储单位。Byte:计算机中基本存储单元。1byte=8bit

浮点类型/小数类型

默认值:0

简单说明:

  1. 浮点数=符号位+指数位+尾数为

  2. 尾数部分可能丢失,造成经度损失。

     package main
    
     import (
        	"fmt"
     )
    
     func main() {
     	var num1 float32 = -123.0000901
     	var num2 float64 = -123.0000901
     	//此处的输出位:num1= -123.00009 num2= -123.0000901
     	//从输出可以看出num1会有精度丢失
     	fmt.Println("num1=", num1, "num2=", num2)
    }
  3. 浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中精度可能丢失

分类:

float32 范围:-3.403E38~3.403E38 存储空间:4字节

float64 范围:-1.798E308~1.798E308 存储空间:8字节

使用细节:

  1. Golang浮点类型有固定的范围和字段长度,不受具体的操作系统影响

  2. Golang的浮点型默认声明位float64

  3. 浮点型常量两种表现形式:

    十进制数形式:如5.12,.512(.512输出时是0.512,必须有小数点)

    科学计数法形式:如5.1234e2 = 5.1234*10的2次方 5.1234E-2 = 5.12/10的2次方

  4. 通常情况下,应该使用float64,因为它比float32更精确。[开发中,推荐使用float64]

字符型

没有专门的字符型,使用byte来保存单个字母字符,可以保存的范围是[0-1,a-z,A-Z..],若保存的字符对应码值大于255,这时推荐使用rune和int类型保存,

默认值:””

package main

import (
	"fmt"
)

func main() {

	var c1 byte
	var c2 byte = 'a'
	var c3 byte = '0'
	
	/*
		var c4 byte = '陈'前边的注释符号会提示溢出报错,
		单个汉字的值已经超出byte类型所能存储的最大数据
		以陈为示例,他的ASCII码值为38472,而byte所能
		存储的最大范围为0~255,因此无法进行保存	
	*/
    //var c4 byte = '陈'	
	//当个汉字字符推荐使用rune来保存(推荐)
	var c4 rune = '陈'
	var c5 int = '莹'

	/*
		直接输出:直接输出时输出的值为ASCII码值
	*/
	//输出结果:默认值为0
	fmt.Println("c1=", c1)
	//输出结果:97
	fmt.Println("c2=", c2)
	//输出结果:48
	fmt.Println("c3=", c3)
	//输出结果:38472
    fmt.Println("c4=", c4)
	//输出结果:33721
    fmt.Println("c5=", c5)

	/*
		如果想要直接输出变量的赋值,不输出ASCII码值则
		使用格式话输出Printf,下边代码中的\n是用来换行的转义符
	*/
	//输出结果:默认值null
	fmt.Printf("c1=%c\n", c1)
	//输出结果:a
	fmt.Printf("c2=%c\n", c2)
	//输出结果:0
	fmt.Printf("c3=%c\n", c3)
	//输出结果:c4=陈,c4对应的码值=38472
	fmt.Printf("c4=%c,c4对应的码值=%d\n",c4,c4)
	//c5=莹,c5对应的码值=33721
	fmt.Printf("c5=%c,c5对应的码值=%d",c5,c5)
}
  • 使用细节:

    1. 字符常量是用单引号括起来的单个字符。如:var c1 byte = ‘a’ var c2 int = ‘中’ var c3 byte = ‘9’

    2. Go中允许使用转义字符’\‘来将其后的字符转变为特殊字符型常量。例如:var c3 char = ‘\n’其中\n表示换行符

    3. Go语言的字符使用UTF-8编码(英文字母1个字节,汉字3个字节)查看字符编码(UTF-8) (mytju.com)

    4. 在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值

    5. 可以直接给某个变量赋一个数字,然后按格式化输出是%c,会输出该数字对应的unicode字符

      package main
      
      import (
      	"fmt"
      )
      
      func main() {
      
      	var num1 int = 21271
      	//输出结果:num1=北,num1对应码值=21271
      	fmt.Printf("num1=%c,num1对应码值=%d", num1 ,num1)
      }
    6. 字符类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码

      package main
      
      import (
      	"fmt"
      )
      
      func main() {
      
      	var num1 int = 21271
      	var num2 int = 55
      	var num3 int = num1 + num2
      	//输出结果:num3=华,num3对应码值=21326
      	fmt.Printf("num3=%c,num3对应码值=%d", num3 ,num3)
      }
  • 字符类型本质探讨:

    1. 字符型存储到计算机中,需要将字符对应的码值(整数)找出来

      存储:字符——>对应码值——>二进制——>存储

      读取:二进制——>码值——>字符——>读取

    2. 字符和码值的对应关系是通过字符编码表决定的(是规定好)

    3. Go语言的编码都统一成了utf-8,和其他的变成语言来说。非常的方便,很统一,在也没有编码的困扰

布尔型

  • 默认值:false

  • 基本介绍:(主要用来表示真假判定)

    1. 布尔类型也叫bool类型,bool类型只允许取值true和false

    2. bool类型只占有1个字节

      package main
      
      import (
      	"fmt"
      	"unsafe"
      )
      
      func main() {
      
      	var b = false
      	//输出结果:b= false b的占用空间大小为: 1 字节
      	fmt.Println("b=", b, "b的占用空间大小为:", unsafe.Sizeof(b), "字节")
      }
    3. boolean类型适于逻辑运算,一般用于程序流程控制

      if条件控制语句

      for循环控制语句

字符串(String)

  • 基本介绍:

    字符串就是遗传固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码识别Unicode文本

  • 基础使用:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    
    	var str string = "洛阳龙门石窟,yyds"
    	//输出结果:洛阳龙门石窟,yyds
    	fmt.Println(str)
    
    }
  • 注意事项和使用细节:

    1. Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,乱码问题不会在困扰

    2. 字符串的两种表现形式

      • 双引号,会识别转义字符
      • 反引号,以字符串的原生形输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
      package main
      
      import "fmt"
      
      func main() {
      
      	str := "Hello\nworld" 
      	/*
      	双引号可以识别转义符
      	输出结果:
      	Hello
      	world
      	*/
      	fmt.Println(str)
      
      	//反引号不会识别转义符会按照赋值的是什么就是什么
      	var str2 string = `
      	// 引入包:文件所在包
      	package main
      	
      	//导入方法使用的包
      	import "fmt"
      	
      	func main() {
      	
      		fmt.Println("\t*\t\t\t\t\t\t\t\t\t\t\t\t*\t")
      		fmt.Println("*\t\t*\t\t\t\tI love Golang\t\t\t*\t\t*")
      		fmt.Println("\t*\t\t\t\t\t\t\t\t\t\t\t\t*\t")
      		fmt.Println("\t\t*\t\t\t\t\t\t\t\t\t\t*\t\t")
      		fmt.Println("\t\t\t*\t\t\t\t\t\t\t\t*\t\t\t")
      		fmt.Println("\t\t\t\t*\t\t\t\t\t\t*\t\t\t\t")
      		fmt.Println("\t\t\t\t\t*\t\t\t\t*\t\t\t\t\t")
      		fmt.Println("\t\t\t\t\t\t*\t\t*\t\t\t\t\t\t")
      		fmt.Println("\t\t\t\t\t\t\t*")
      	}`
      	fmt.Println(str2)
      
      }
      
    3. 字符串拼接方式

      package main
      
      import "fmt"
      
      func main() {
      
      	var str1 = "hello world!"
      	var str2 = "Luo Yang"
      
      	str := str1+str2
      	//输出结果:hello world!Luo Yang
      	fmt.Println(str)
      
      }
    4. 当一行中多个字符串进行拼接时并且导致长度过长,需要使用到多行字符串,使用+号进行拼接,但是换行时加号必须在上边一行

      package main
      
      import "fmt"
      
      func main() {
      
      	str := "Hello " + "Luo Yang" + "Hello " + "Luo Yang" +
      		"Hello " + "Luo Yang" + "Hello " + "Luo Yang" +
      		"Hello " + "Luo Yang" + "Hello " + "Luo Yang" +
      		"Hello " + "Luo Yang"
      	//输出结果:Hello Luo YangHello Luo YangHello Luo YangHello Luo YangHello Luo YangHello Luo YangHello Luo Yang
      	fmt.Println(str)
      
      }

基本数据类型的转换

  • 介绍:

    Golang和Java/C不同,Go在不同类型的变量之间赋值时需要显示转换。也就是说Golang中数据类型不能自动转换

  • 基本语法:

    表达式T(v)将值v转换为类型T

    T:就是数据类型,比如int32,int64,float32等等

    v:就是需要转换的变量

  • 代码演示:

    package main
    
    import "fmt"
    
    func main() {
    
    	var i int = 42
    	//输出结果:i的类型为int,i的值为42
    	fmt.Printf("i的类型为%T,i的值为%d\n", i, i)
    	var f float64 = float64(i)
    	//输出结果:f的类型为float64,f的值为42
    	fmt.Printf("i的类型为%T,i的值为%v\n", f, f)
    	var u uint8 = uint8(f)
    	//输出结果:u的类型为uint8,u的值为42
    	fmt.Printf("i的类型为%T,i的值为%d\n", u, u)
    
    }
  • 注意事项以及细节说明:

    1. Go中,数据类型的转换可以从表示范围小->表示范围大,也可以范围大->范围小
    2. 被转换的时变量存储的数据(即值),变量本身的数据类型并没有变化!
    3. 在转换中,比如将int64转成int8,编译时不会报错,只是转换的结果时按溢出处理,和我们希望的结果不一样
  • 注意事项以及细节说明演示代码:

    package main
    
    import "fmt"
    
    func main() {
    
    	var f float64 = 64.555
    	//输出结果:f的类型为float64,f的值为64.555
    	fmt.Printf("i的类型为%T,i的值为%v\n", f, f)
    	var u uint8 = uint8(f)
    	//输出结果:u的类型为uint8,u的值为64
    	fmt.Printf("i的类型为%T,i的值为%d\n", u, u)
    	var i int = int(f)
    	//输出结果:i的类型为int,i的值为64
    	fmt.Printf("i的类型为%T,i的值为%d\n", i, i)
    	//输出结果:f的类型为float64,f的值为64.555
    	fmt.Printf("i的类型为%T,i的值为%v\n", f, f)
    
    }

基本数据类型和string的转换

  • 介绍:

    在程序开发中,我们经常需要将基本数据类型转换成string类型。或者将string类型转换成基本数据类型

  • 基本数据类型转string类型:

    1. 方式1:fmt.Sprintf(“%参数”,表达式)

      1. 参数余姚和表达式的数据类型相匹配

      2. fmt.Sprintf()会返回转换后的字符串

      3. 代码演示:

        package main
        
        import "fmt"
        
        func main() {
        
        	var i int = 99
        	var f float64 = 66.666
        	var bool bool = true
        	var char byte = 'h'
        	var s string
        
        	//将i值转换为字符串
        	s = fmt.Sprintf("%d", i)
        	//输出结果:s的类型为:string,s的值为:"99"
        	fmt.Printf("s的类型为:%T,s的值为:%q\n", s, s)
        	//将f值转换为字符串
        	s = fmt.Sprintf("%f", f)
        	//输出结果:s的类型为:string,s的值为:"66.666000"
        	fmt.Printf("s的类型为:%T,s的值为:%q\n", s, s)
        	//将bool值转换为字符串
        	s = fmt.Sprintf("%t", bool)
        	//输出结果:s的类型为:string,s的值为:"true"
        	fmt.Printf("s的类型为:%T,s的值为:%q\n", s, s)
        	//将char值转换为字符串
        	s = fmt.Sprintf("%c", char)
        	//输出结果:s的类型为:string,s的值为:"h"
        	fmt.Printf("s的类型为:%T,s的值为:%q\n", s, s)
        
        }
    2. 方式2:使用strconv包函数

      1. 代码演示:

        package main
        
        import (
        	"fmt"
        	//导入strconv包
        	"strconv"
        )
        
        func main() {
        
        	var i int = 99
        	var f float64 = 66.666
        	var bool bool = true
        	var u uint = 88
        	var num int = 4567
        	var s string
        
        	//将bool类型转换为字符串类型
        	s = strconv.FormatBool(bool)
        	//输出结果:s的数据类型为:string,数据的值为:"true"
        	fmt.Printf("s的数据类型为:%T,数据的值为:%q\n", s, s)
        	/*
        		将f类型转换为字符串类型
        		传入参数:
        		第一个:需要转换的数据
        		第二个:格式,f为默认格式,其余格式参考接口文档
        		第三个:小数点后保留位数
        		第四个:需要转换的变量数据类型时float64还是float32
        	*/
        	s = strconv.FormatFloat(f, 'f', 5, 64)
        	//输出结果:s的数据类型为:string,数据的值为:"66.66600"
        	fmt.Printf("s的数据类型为:%T,数据的值为:%q\n", s, s)
        	/*
        		将int类型转换为字符串类型,
        		传入参数:
        		第一个:需要转换的变量,参数类型需要为int64,如果不满足需要强制转换
        		第二个:需要转换的变量的进制此处为10进制(范围:2~36)
        	*/
        	s = strconv.FormatInt(int64(i), 10)
        	//输出结果:s的数据类型为:string,数据的值为:"99"
        	fmt.Printf("s的数据类型为:%T,数据的值为:%q\n", s, s)
        	/*
        		将uint类型转换为字符串类型
        		传入参数:
        		第一个:需要转换的变量,传入参数要求必须为uint64,不满足需强制转换
        		第二个:需要转换的变量的进制
        	*/
        	s = strconv.FormatUint(uint64(u), 10)
        	//输出结果:s的数据类型为:string,数据的值为:"88"
        	fmt.Printf("s的数据类型为:%T,数据的值为:%q\n", s, s)
        
        	/*
        		strconv包中还有一个函数Itoa用来将int类型转换为字符串
        		传入参数:
        		第一个:传入要转换为字符串类型的int类型数据
        		需要注意:传入的变量类型必须为int如果不是需要进行强转
        	*/
        	s = strconv.Itoa(num)
        	fmt.Printf("s的数据类型为:%T,数据的值为:%q\n", s, s)
        
        }

string类型转基本数据类型

  • 使用strconv包函数

    代码演示:

    package main
    
    import (
    	"fmt"
    	//导入strconv包
    	"strconv"
    )
    
    func main() {
    
    	var s1 string = "true"
    	var s2 string = "12345"
    	var s3 string = "66.666"
    	var b bool
    	var i int64
    	var f float64
    	var u uint64
    
    	/*
    		使用strconv的转换字符串为bool类型,
    		传入参数:
    		第一个:需要转换为bool类型的字符串
    		返回值:
    		第一个:数据类型:bool 转换后的bool类型的值
    		第二个:数据类型:err
    	*/
    	b, _ = strconv.ParseBool(s1)
    	//输出结果:s的数据类型为:string,数据的值为:true
    	fmt.Printf("b的数据类型为:%T,数据的值为:%t\n", b, b)
    
    	/*
    		使用strconv的转换字符串为int类型,
    		传入参数:
    		第一个:需要转换为int类型的字符串	数据类型:string
    		第二个:返回值进制数,范围是2~36	数据类型:int
    		第三个:返回值整数类型,此处必须是无溢出的		数据类型:int
    		返回值:
    		第一个:数据类型:int 转换后的int类型的值
    		第二个:数据类型:err
    	*/
    	i, _ = strconv.ParseInt(s2, 10, 64)
    	//输出结果:i的数据类型为:int64,数据的值为:12345
    	fmt.Printf("i的数据类型为:%T,数据的值为:%d\n", i, i)
    
    	/*
    		使用strconv的转换字符串为int类型,
    		传入参数:
    		第一个:需要转换为int类型的字符串	数据类型:string
    		第二个:返回值数据类型,如果想要返回float32则传入参数填32,float64则填64	数据类型:int
    		返回值:
    		第一个:数据类型:float64 转换后的float64类型的值
    		第二个:数据类型:err
    	*/
    	f, _ = strconv.ParseFloat(s3, 64)
    	//输出结果:f的数据类型为:float,数据的值为:66.666
    	fmt.Printf("f的数据类型为:%T,数据的值为:%f\n", f, f)
    
    	/*
    		使用strconv的转换字符串为uint类型,
    		传入参数:
    		第一个:需要转换为uint类型的字符串	数据类型:string
    		第二个:返回值进制数,范围是2~36	数据类型:int
    		第三个:返回值整数类型,此处必须是无溢出的		数据类型:int
    		返回值:
    		第一个:数据类型:uint 转换后的uint类型的值
    		第二个:数据类型:err
    	*/
    	u, _ = strconv.ParseUint(s2, 10, 64)
    	//输出结果:i的数据类型为:int64,数据的值为:12345
    	fmt.Printf("i的数据类型为:%T,数据的值为:%d\n", u, u)
    
    }

派生/复杂数据类型

指针(pointer)

数组

结构体(struct)

管道(Channel)

函数

切片(slice)

接口(interface)

map

变量

介绍

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

为什么需要变量

变量是程序的基本组成单位:不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。

package main

import "fmt"

//getVal为自定义方法名,第一个大括号内为需要传入的参数以及参数类型,第二个括号内为返回值个数和数据类型
func getVal(num1 int, num2 int) (int, int){
    //sum和sub均为定义的变量,num1和num2为传入的参数
	sum := num1 + num2
	sub := num1 - num2
	return sum, sub		//此处是返回值
}

//主函数(主方法)程序入口
func main() {
    //定义变量sum和sub用来接收getVal的返回值,顺序与方法中的返回值顺序相同
	sum, sub := getVal(30, 20)
	fmt.Println("sum=", sum, "sub=", sub)
	sum2, _ := getVal(30, 30)
	fmt.Println("sum2=", sum2)
}

运行结果如下所示:

image-20240306152100396

使用步骤

  1. 变量声明(有人也叫: 定义变量)
  2. 赋值
  3. 使用

变量声明的方式以及使用

package main
import "fmt"

//全局变量:此变量可以在任何地方使用不需要传入
var tom = 100
var jack = 200
//一次声明多个全局变量
var(
    marry = 18
    kiko = 22
    mimi = 44
)

func main () {
    //方式一:指定变量类型定义后若不赋值则使用默认值:i是自定义的变量名,int是定义的变量的数据类型为int类型
    var i int
    fmt.Println("变量声明方式一:i=", i)
    
    //方式二:根据值自行判定变量类型(类型推导)
    var num = 10.11
    fmt.Println("变量声明方式二:num=", num)
    
    //方式三:省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误
    num2 := "hello"
    //i := 1	//此处放开前边注释会导致编译错误,因为前边已经定义过变量名为i的变量
    fmt.Println("变量声明方式三:num2=",num2)
    
    //多变量声明方式一
    var n1, n2, n3 int
    fmt.Println("n1=", n1, "n2=", n2, "n3=", n3)
    
    //多变量声明方式二
    var n4, n5, n6 = 10, "tom", 888
    fmt.Println("n4=", n4, "n5 =", n5, "n6=", n6)

	//多变量声明方式三
    n7, n8, n9 := 10, "cat", 666
    fmt.Println("n7=", n7, "n8 =", n8, "n9=", n9)
    
    //变量赋值,给自定义的i赋值为20
    i = 20
    
    //使用变量
    fmt.Println("i=", i)
    
    //输出全局变量
    fmt.Println("tom=", tom, "jack", jack)
    fmt.Println("marry=", marry, "kiko=", kiko, "mimi=", mimi)
    
}

使用注意事项

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

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

  3. Golang变量使用的三种方式

    1. 指定变量类型,声明后若不赋值,使用默认值
    2. 根据值自行判定变量类型(类型推导)
    3. 省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误
  4. 多变量声明,在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法

  5. 该区域的数据值可以在同一类型范围内不断变化

    package main
    import "fmt"
    
    func main() {
        var i int
        //此处的输出结果为0
        fmt.Println("初始默认值:", i)
        i = 30
        //此处的输出结果为30
        fmt.Println("第一次变化的值:", i)
        i = 50
        //此处的输出结果为50
        fmt.Println("第二次变化的值:", i)
        
        //i = 1.2		//变量i的数据类型为整数型因此只能存储整数型数据,此处删除行前的注释则会报错
    }
  6. 变量在同一作用域内(在一个函数或者在代码块)不能重名

    package main
    import "fmt"
    
    func main() {
        var i int
        i := 99	//此处会报错,同一作用域内变量重复导致报错
    }
  7. 变量=变量名+值+数据类型

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

    package main
    import "fmt"
             
    func main() {
        var i int
        //此处的输出结果为:int数据类型默认值: 0
        fmt.Println("int数据类型默认值:", i)
        var str string
        //此处的输出结果为:string数据类型默认值:"  "
        fmt.Println("string数据类型默认值:\"", str, "/""
    }