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)))
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
值得注意的是
- 可以通过指针改变指向值
var num int = 3
fmt.Println(num)
//var ptr *float32 = &num //错的
var ptr1 *int = &num //ptr1就是num的地址了
*ptr1 = 6 //改对应地址指向的值
fmt.Println(num)
}
- 指针变量接收的一定是地址值
3. 指针变量的地址不可以不匹配
4. 基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型
- 例如int对应的指针就是*int
- float32对应的指针就是*float,以此类推
标识符
什么是标识符:
变量,方法等,只要是起名字的地方,那个名字就是标识符
- 例如:var age int = 19 var price floa64 = 9.8
标识符定义的规则
1. 三个(组成部分):数字,字母,下划线_
Ps: 字母含义比较宽泛,使用汉字也是可以的,但是不建议使用,建议使用字母,26个字母组合
2. 四个注意:
- 3. 不可以以数字开头,
-
- 严格区分大小写,
-
- 不能包含空格,
-
- 不可以使用GO中的保留关键字
3. 见名知意:一看就知道表示的什么,增加可读性
4. 下划线“_”本身GO中是一个特殊的标识符,称为空标识符。
可以代表任何其他的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)所以仅仅能被作为占位符使用,不能单独作为标识符使用
5. 可以用如下形式,但是不建议:
var int int =10(int,float等不算保留关键字,但是也尽量不使用
6. 长度无现在,但不建议太长
7. 起名规则
-
一:包名:尽量保存package的名字和目录保持一直,尽量采取有意义的包名,简短,有意义,不要和标准库冲突
-
- 为什么之前在定义源文件时,一般我们都有package main包?
原因:Main包是一个程序的入口包,所以你main函数所在的包建议定义为main包,如果不定义为main包,那么就得不到可执行文件
- 为什么之前在定义源文件时,一般我们都有package main包?
-
- 尽量保持和package的名字和目录保持一致
-
- 和标准库不要冲突
-
二:变量名,函数名,常量名:驼峰法 :就是单词按照大写区分 Var stuNameDetail string = ‘li’
-
三 :如果变量名,函数名,常量名首字母大写,则可以被其他的包访问 如果首字母小写,只能在本包中使用(利用首字母大小写完成权限控制)
注意:import导入语句通常放在文件开头包声明语句下 导入的包名需要使用双引号包裹起来 包名是从$GOPATH/src后开始计算,使用/进行路径分割 -
配置一个环境变量:GOPATH
我的电脑——>属性——>高级系统设置——>高级——>环境变量——>系统变量中新建:变量名为GOPATH,变量值为你保存的src之前的地方
两个函数的连接
一个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个,包含基础数据类型和系统内嵌函数
| append | bool | byte | cap | close | complex |
|---|---|---|---|---|---|
| complex64 | complex128 | uint16 | copy | false | float32 |
| float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new |
| nil | panic | uint64 | println | real | |
| recover | string | true | uint | uint8 | uintptr |