GO语言语法(2) | 青训营

88 阅读8分钟

GO语言基础语法(2)

基本数据类型转换

代码请连着看,分开是为了解释说明
ps:一定要匹配等于号左右的数据类型

package main

import "fmt"

func main() {
	//进行类型转换
	var n1 int = 100
	//var n2 float32 = n1  //在这里自动转换不好使,不如显示转换
	fmt.Println(n1)
	//fmt.Println(n2)
	var n2 float32 = float32(n1)
	fmt.Println(n2)
	//注意n1类型其实就是int类型,只是将n1的值100转为了float32而已,n1还是int
	fmt.Printf("%T", n1)   //int
	fmt.Printf("\n%T", n2) //float32
	fmt.Println()

将int64转为int8时,编译不会出错,但是数据会溢出

  var n3 int64 = 888888
  var n4 int8 = int8(n3)
  fmt.Println(n4) //56

  var n5 int32 = 12
  var n6 int64 = int64(n5) + 30 //一定要匹配等于号左右的数据类型
  fmt.Println(n5)
  fmt.Println(n6)

  var n7 int64 = 12
  var n8 int8 = int8(n7) + 127 //编译通过,但结果可能会溢出
  //var n9 int8 = int8(n7) + 128  //编译不通过,最多+127
  fmt.Println(n8)
}

基本类型转string(字符串)类型

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

推荐方式1,简单,只需要fmt包

  • %v,原样输出
  • %q:把对应值用双引号括起来
  • %f:小数
  • %t:布尔型
  • %c:字符型**
package main

import (
	"fmt"
)

func main() {
	//方法1  只有fmt包
	var n1 int = 12
	var n2 float32 = 3.14
	var n3 bool = true
	var n4 byte = 'a'

	var s1 string = fmt.Sprintf("%d", n1) //%d  十进制
	//fmt.Printf("s1的类型是: %T, s1 = %v", s1, s1) //%v  输出原样
	// %q把对应值用双引号括起来
	fmt.Printf("s1的类型是: %T, s1 = %q  \n", s1, s1)//s1的类型是: string, s1 = "12"  

	var s2 string = fmt.Sprintf("%f", n2) //%f  小数
	fmt.Printf("s2的类型是: %T, s2 = %q  \n", s2, s2)

	var s3 string = fmt.Sprintf("%t", n3) //%t  布尔值
	fmt.Printf("s3的类型是: %T, s3 = %q  \n", s3, s3)

	var s4 string = fmt.Sprintf("%c", n4) //%c  字符
	fmt.Printf("s4的类型是: %T, s4 = %q  \n", s4, s4)

方式2:使用strconv包的函数

需要使用用的strconv包, 规则比较多,连着看
int转string: strconv.FormatInt(1,2)

  • 第一个参数必须转成int64
  • 第二个参数是进制
package main

import (
	"fmt"
	"strconv"
)

func main() {
        var n5 int = 22
	var s5 string = strconv.FormatInt(int64(n5), 10) //第一个参数必须转成int64 ,第二个参数是进制
	fmt.Printf("s5的类型是: %T, s5 = %q  \n", s5, s5)

float转string时
strconv.FormatFloat(1,2,3,4):

  • 第二个参数 'f'(-ddd.ddd)小数的十进制
  • 第三个参数:9——保留小数后9位
  • 第四个参数:表示这个小数float64类型(看开始的定义)
	var n6 float64 = 5.66
	var s6 string = strconv.FormatFloat(n6, 'f', 9, 64)
	//第二个参数 'f'(-ddd.ddd)小数的十进制,第三个参数:9:保留小数后9位
	//第四个参数:表示这个小数float64类型(看开始的定义)
	fmt.Printf("s6的类型是: %T, s6 = %q  \n", s6, s6)

bool转string时
strconv.FormatBool(1) 就是要转的变量

	var n7 bool = false
	var s7 string = strconv.FormatBool(n7)
	fmt.Printf("s7的类型是: %T, s7 = %q  \n", s7, s7)

}

string转基本类型

要用上strconv包:这个在 []((Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com))) QQ图片20230819201231.png
ps:代码连起来看,分开就是为了解释说明

string——>bool

b, _ = strconv.ParseBool(s1)

  • 这个函数的返回值有两个:(value bool,err error)
  • value就是我们得到的布尔类型的数据,err是出现的错误
  • 我们只关注得到的布尔类型的数据,err可以_直接忽略
package main

import (
	"fmt"
	"strconv"
)

func main() {
	//string-->bool
	var s1 string = "true"
	var b bool
	//ParseBool :这个函数的返回值有两个:(value bool,err error)
	//value就是我们得到的布尔类型的数据,err是出现的错误
	//我们只关注得到的布尔类型的数据,err可以_直接忽略
	b, _ = strconv.ParseBool(s1)
	fmt.Printf("b的类型是: %T,b = %v  \n", b, b)

string-->int64

n, _ = strconv.ParseInt:(1,2 ,3)

  • 第一个是要转的参数
  • 第二个是进制
  • 第三个是转的int几
	var s2 string = "66"
	var n int64
	n, _ = strconv.ParseInt(s2, 10, 64) //第一个是要转的参数,第二个是进制,第三个是转的int几
	fmt.Printf("n的类型是: %T,n = %v   \n", n, n)

string-->float32/64

f, _ = strconv.ParseFloat(1, 2)

  • 第一个是要转的参数
  • 第二个是要转到float几
	var s3 string = "4.6"
	var f float64
	f, _ = strconv.ParseFloat(s3, 64) //第一个是要转的参数,第二个是要转到float几
	fmt.Printf("f的类型是: %T,f = %v   \n", f, f)

	//注意:stirng向基本类型转换时,一定要确保string类型能够转化成有效数据类型,否则最后输出是默认值
	var s4 string = "golang"
	var n1 int64
	n1, _ = strconv.ParseInt(s4, 10, 64)
	fmt.Printf("n1的类型是: %T,n = %v   \n", n1, n1)
}

指针

指针这块比较难理解,有些弯弯绕绕,可以敲代码理解理解,一个是地址,一个是值需要区分清楚,&取地址, *取值

ptr——指针变量的名字
ptr对应的类型是——*int,是一个指针类型(可以理解为 指向int类型的指针) 最重要的就是两个符号

1.&符号是取内存地址:&符号+变量,就可以获取这个变量内存的地址

2.*(星符号):根据地址取值

package main

import "fmt"

func main() {
	var age int = 18
	fmt.Println(&age) //&符号+变量,就可以获取这个变量内存的地址:0xc0000a6058
	//定义一个指针变量
	//var代表要声明的一个变量
	//ptr 指针变量的名字
	//ptr对应的类型是:*int,是一个指针类型(可以理解为 指向int类型的指针)
	//&age 就是一个地址,是ptr变量的具体的值
	var ptr *int = &age
	fmt.Println(ptr)
	fmt.Println("ptr本身这个存储空间的地址为:", &ptr) //0xc0000ca020

	//想获取ptr这个指针或者这个地址指向的那个数据
	fmt.Println("ptr指向的数值为: ", *ptr) //ptr指向的数值为:18

值得注意的是

  1. 可以通过指针改变指向值
	var num int = 3
	fmt.Println(num)
	//var ptr *float32 = &num //错的
	var ptr1 *int = &num //ptr1就是num的地址了
	*ptr1 = 6            //改对应地址指向的值
	fmt.Println(num)

}
  1. 指针变量接收的一定是地址值

图片1.png 3. 指针变量的地址不可以不匹配

图片1.png 4. 基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型

  • 例如int对应的指针就是*int
  • float32对应的指针就是*float,以此类推

标识符

什么是标识符:

变量,方法等,只要是起名字的地方,那个名字就是标识符

  • 例如:var age int = 19    var price floa64 = 9.8

标识符定义的规则

1. 三个(组成部分):数字,字母,下划线_
Ps: 字母含义比较宽泛,使用汉字也是可以的,但是不建议使用,建议使用字母,26个字母组合

2. 四个注意:

  • 3. 不可以以数字开头,
    1. 严格区分大小写,
    1. 不能包含空格,
    1. 不可以使用GO中的保留关键字

3. 见名知意:一看就知道表示的什么,增加可读性
4. 下划线“_”本身GO中是一个特殊的标识符,称为空标识符。
可以代表任何其他的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)所以仅仅能被作为占位符使用,不能单独作为标识符使用

QQ图片20230819205118.png

5. 可以用如下形式,但是不建议:
var int int =10(int,float等不算保留关键字,但是也尽量不使用
6. 长度无现在,但不建议太长 7. 起名规则

  • :包名:尽量保存package的名字和目录保持一直,尽量采取有意义的包名,简短,有意义,不要和标准库冲突

    1. 为什么之前在定义源文件时,一般我们都有package main包?
      原因:Main包是一个程序的入口包,所以你main函数所在的包建议定义为main包,如果不定义为main包,那么就得不到可执行文件

图片3.png

图片4.png

    1. 尽量保持和package的名字和目录保持一致
    1. 和标准库不要冲突

图片5.png

  • :变量名,函数名,常量名:驼峰法 :就是单词按照大写区分 Var stuNameDetail string = ‘li’

  • :如果变量名,函数名,常量名首字母大写,则可以被其他的包访问 如果首字母小写,只能在本包中使用(利用首字母大小写完成权限控制)
    注意:import导入语句通常放在文件开头包声明语句下 导入的包名需要使用双引号包裹起来 包名是从$GOPATH/src后开始计算,使用/进行路径分割

  • 配置一个环境变量:GOPATH
    我的电脑——>属性——>高级系统设置——>高级——>环境变量——>系统变量中新建:变量名为GOPATH,变量值为你保存的src之前的地方

QQ图片20230819211441.png

QQ图片20230819211604.png

两个函数的连接
一个test15.go

package test15

var StuNo int = 20034 //定义学号

一个main.go

package main //声明为main包,程序的入口包

import (
	"fmt"
	"gocode/Unit1/main/demo15/test15"
)

// 程序的入口函数
func main() {
	fmt.Println(test15.StuNo)
}

关键字和预定义标识符

(1) 关键字:就是程序发明者规定的有特殊含义的单词,又叫保留字,go语言中一共有25个关键字。

| break | default | func | interface | select | | | | | | | | case | defer |go | map| struct| | chan | else | goto|package |switch | | const | fallthrough |if |range | type| | continue | for |import |return | var|

(2) 预定义标识符:一共36个,包含基础数据类型和系统内嵌函数

appendboolbytecapclosecomplex
complex64complex128uint16copyfalsefloat32
float64imagintint8int16uint32
int32int64iotalenmakenew
nilpanicuint64printprintlnreal
recoverstringtrueuintuint8uintptr