go语言基础

golang 数据类型
基本数据类型
数值型
整数型(int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64,byte)
浮点型(float32,float64)
字符型(没有单独的字符型,使用byte来保存单个字母字符)
布尔型(bool)
字符串(string)
派生数据类型/复杂数据类型
指针
数组
结构体
管道
函数
切片
接口
map



进制转换


整数类型介绍
简单说,就是用于存放整数值的,比如10,-45等等
有符号整数类型
类型 有无符号 占用存储空间 表示范围
int8 有 1字节 -2^7~2^7-1(-128~127)
int16 有 2字节 -2^15~2^15-1(-32768~32767)
int32 有 4字节 -2^31~2^31-1(-2147483648~2147483647)
int64 有 8字节 -2^63~2^63-1
ps 一个字节8位 第一位符号位 01111111 127

有符号整数类型
类型 有无符号 占用存储空间 表示范围
uint8 无 1字节 0~255
uint16 无 2字节 0~2^16-1
uint32 无 4字节 0~2^31-1
uint64 无 8字节 0~2^63-1

其他整数
类型 有无符号 占用存储空间 表示范围
int 有 32位系统4个字节/64位系统8字节 -2^31~2^31-1 -2^63~2^63-1
uint 无 32位系统4个字节/64位系统8字节 0~2^31-1 0~2^63-1
rune 有 等价int32 0~2^63-1
byte 无 等价uint8 0~255
golang 整数类型默认声明int 型

测试
package main

import (
	"fmt"
	"unsafe"
)
func main(){
	//定义一个整型
	var num1 int8 = 23

	fmt.Println(num1)
	/*
		D:\golang>go run D:\golang\goproject\src\src01\demo3\main01.go
		# command-line-arguments
		goproject\src\src01\demo3\main01.go:5:18: cannot use 230 (untyped int constant) as int8 value in variable declaration (overflows)

	*/
	var num3 = 28
	//printf 函数作用就是格式化
	/*
	%v	值的默认格式表示
	%+v	类似%v,但输出结构体时会添加字段名
	%#v	值的Go语法表示
	%T	值的类型的Go语法表示
	%%	百分号
	 */
	fmt.Printf("num3的类型:%T", num3)
	fmt.Println()
	fmt.Println(unsafe.Sizeof(num3))//unsafe 导包。显示字节数

}

  执行结果

 

D:\golang>go run D:\golang\goproject\src\src01\demo3\main01.go
23
num3的类型:int
8

  浮点类型

简单说就是用于存放小数值的,比如3.14、0、28

浮点类型种类

类型 存储字节 表示范围
flaot32 4字节 -3.403E38~3.403E38
flaot64 8字节 -1.798E38~1.798E308

底层存储空间与操作系统无关;浮点类型底层存储 符号位+ 指数位+尾数位。尾数位只是存储大概,可能会出现精度损失

测试

package main
import "fmt"
func main(){
	//定义浮点类型
	var num1 float32 = 3.14
	fmt.Println(num1)
	//正数负数都可以
	var num2 float32 = -3.14
	fmt.Println(num2)
	//浮点数可以用十进制表示,也可以用科学计数法表示,E大小写都可以
	var num3 float32 = 314E-2
	fmt.Println(num3)
	var num4 float32 = 314E+2
	fmt.Println(num4)
	var num5 float32 = 314e+2
	fmt.Println(num5)
	var num6 float32 = 314e+2
	fmt.Println(num6)
	//浮点数可能会有精度损失,建议使用float64
	var num7 float32 = 256.000000916
	fmt.Println(num7)
	var num8 float64 = 256.000000916
	fmt.Println(num8)
	//golang里默认的浮点类型为float64
	cx := 3.17
	fmt.Printf("cx 对应的数据类型:%T",cx)
/* 	3.14
	-3.14
	3.14
	31400
	31400
	31400
	256
	256.000000916
	cx 对应的数据类型:float64 */
}

  执行结果

3.14
-3.14
3.14
31400
31400
31400
256
256.000000916
cx 对应的数据类型:float64

  字符类型

package main
import "fmt"
func main(){
    var c1 byte = 'a'
	fmt.Println(c1)	//定义字符类型的数据
	var c2 byte = '6'
	fmt.Println(c2)
	var c3 byte = '('
	fmt.Println(c3)
	//字符类型本质上就是整数,也可以参与运算。输出时,会将对应的码值做一个输出
	//字符等是按照ASCII 码表
	var c4 int = '中' //汉字字符对应的码值,底层对应的是Unicode码值,对应的码值为20013,byte类型溢出,能存储范围:可以用int
	fmt.Println(c4)  //总结 golang的字符对应使用的是UTF-8编码
	var c5 byte = 'A'
	fmt.Printf("c5对应的具体字符:%c",c5)
}

  执行结果

PS D:\golang\goproject> go run src\src01\demo5\main.go
# command-line-arguments
src\src01\demo5\main.go:12:16: cannot use '中' (untyped rune constant 20013) as byte value in variable declaration (overflows)
PS D:\golang\goproject> go run src\src01\demo5\main.go
97
54
40
20013
c5对应的具体字符:A

  

转义字符: 将后面字符表示特殊含义
转义字符        含义            unicode值
\b              退格            \u0008
\n              换行            \u000a
\r              回车            \u000d
\t              制表符          \u0009
\"              双引号          \u0022
\'              单引号          \u0027
\\              反斜杠          \u005c

测试
package main
import "fmt"
func main(){
	//连续转义字符
	fmt.Println("aaaaaaa\nbbbbbbbbb")
	//\b 退格
	fmt.Println("aaaaaaaaaaa\bbbbbbbbbb")
//\r 回车   bbbbbbbbbaa
	fmt.Println("aaaaaaaaaaa\rbbbbbbbbb")
	//\t
	fmt.Println("aaaaaaaaaaa\tbbbbbbbbb")
	fmt.Println("aaaaaaaaa\tbbbbbbbbb")
}

  执行

PS D:\golang\goproject> go run src\src01\demo6\mian.go
aaaaaaa
bbbbbbbbb
aaaaaaaaaabbbbbbbbb
bbbbbbbbbaa
aaaaaaaaaaa     bbbbbbbbb
aaaaaaaaa       bbbbbbbbb

  布尔类型

布尔类型也叫bool类型,bool类型数据只允许取值true和false
布尔类型只占一个字节
布尔类型适于逻辑运算,一般用于流程控制
测试
package main
import "fmt"
func main() {
	var flag01 bool = true
	fmt.Println (flag01)
	var flag02 bool = 5> 9
	fmt.Println(flag02)
}

  执行

PS D:\golang\goproject\src\src01> go run demo7\mian.go
true
false

  字符串

package main
import "fmt"
func main(){
	//定义
	var s1 string = "你好我是亚马逊"
	fmt.Println(s1)
	//字符串是不可变的
	var s2 string = "abc"
	//s2[0] = 't'
	fmt.Println(s2)
/* # command-line-arguments
demo8\mian.go:9:2: cannot assign to s2[0] (neither addressable nor a map index expression) */
    //字符串的表示形式,如果字符串没有特殊字符,字符串表示形式用双引号
	var s3 string = "as"
	//如果字符串有特殊字符,字符串表示形式用反引号
	var s4 string = `
	package main //声明包,每个go文件必须有归属包
import "fmt" //导入工具包,使用
func main(){ // main 主函数
	fmt.Println("你好")// 打印输出内容
	var age = 10 +9
	fmt.Println(age) 
	fmt.Println("qqqqqqqqqq",
	"qqqqqqqqqqqq",
	"qqqqqqqqqqqq",
	"qqqqqqqqqqqq",
	"qqqqqqqqqqqqq")
}
`
	fmt.Println(s3)
	fmt.Println()
	fmt.Println(s4)

	//字符串拼接
	var s5 string = "abc" + "def"
	s5 += "hijk"
	fmt.Println(s5)
	fmt.Println()

	//当一个字符串拼接过长 注意+ 保留在上一行最后
	var s6 string = "cx" + "xx" +
	"ff" + "qq" +
	"cd"
	fmt.Println(s6)

}

  执行结果

PS D:\golang\goproject\src\src01> go run demo8\mian.go
你好我是亚马逊
abc
as


        package main //声明包,每个go文件必须有归属包
import "fmt" //导入工具包,使用
func main(){ // main 主函数
        fmt.Println("你好")// 打印输出内容
        var age = 10 +9
        fmt.Println(age)
        fmt.Println("qqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqqq")
}

abcdefhijk
cxxxffqqcd
PS D:\golang\goproject\src\src01> go run demo8\mian.go
你好我是亚马逊
abc
as


        package main //声明包,每个go文件必须有归属包
import "fmt" //导入工具包,使用
func main(){ // main 主函数
        fmt.Println("你好")// 打印输出内容
        var age = 10 +9
        fmt.Println(age)
        fmt.Println("qqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqq",
        "qqqqqqqqqqqqq")
}

abcdefhijk

cxxxffqqcd

  基本数据类型默认值

package main
import "fmt"
func main(){
	var a int
	var b float32
	var c float64
	var d bool
	var e string
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
	fmt.Println(d)
	fmt.Println(e)

}


执行结构
C:\Users\尘曦>go run D:\golang\goproject\src\src01\demo9\main.go
0
0
0
false

   类型转换

1.go 在不同类型的变量之间赋值时需要显示转换,并且只有显示转换
语法
表达式T (V) 将V值转换为类型T
T : 就是数据转换类型
V : 就是需要转换变量
数值类型间转换
package main
import "fmt"
func main(){
	//类型转换
	var n1 int = 100
	//var n2 float32 = n1//错误写法 
	//报错
	//# command-line-arguments
    //demo10\main.go:6:19: cannot use n1 (variable of type int) as float32 value in variable declarat
	var n2 float32 = float32(n1) //正确写法
	//执行结果
	//PS D:\golang\goproject\src\src01> go run demo10\main.go
//100
	fmt.Println(n2)
	var n3 int64 = 888888
	fmt.Println(n3)
	var n4 int8 = int8(n3)//int64转为int8的时候编译不会出错的,但是会有数据的溢出
	fmt.Println(n4)// 56
	var n5 int32 = 12
	//var n6 int64 = n5+30 //错误写法 = 左右数据类型
	var n6 int64 = int64(n5)+30
	fmt.Println(n6)
	var n7 int64 = 12
	var n8 int8 = int8(n7) + 127 //编译通过,结果可能会溢出;-117
	//var n9 int8 = int8(n7) + 128 //编译不过溢出;demo10\main.go:25:27: 128 (untyped int constant) overflows int8
	
	fmt.Println(n8)
	//fmt.Println(n9)
}



执行结果
PS D:\golang\goproject\src\src01> go run demo10\main.go
100
888888
56
42
-117

  

字符串转换
基本数据类型和string 类型转换
在程序开发中,经常需要将基本数据类型转成string类型。或者将string类型转成基本数据类型
基本数据转string类型
方式
fmt.Sprintf("%参数",表达式)
package main

import "fmt"
	

func main(){
	var n1 int = 19
	var n2 float32 = 4.78
	var n3 bool = false
	var n4 byte = 'a'
	var s1 string = fmt.Sprintf("%d",n1)// 整数:
/* 
%b	表示为二进制
%c	该值对应的unicode码值
%d	表示为十进制
%o	表示为八进制
%q	该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x	表示为十六进制,使用a-f
%X	表示为十六进制,使用A-F
%U	表示为Unicode格式:U+1234,等价于"U+%04X" */
	fmt.Printf("s1对应类型是:%T, s1 = %v\n",s1 ,s1)//%v	值的默认格式表示;%T	值的类型的Go语法表示
	var s2 string = fmt.Sprintf("%f",n2)//%f	有小数部分但无指数部分,如123.456
	fmt.Printf("s2对应类型是:%T, s2 = %v\n",s2 ,s2)
	var s16 string = fmt.Sprintf("%f",n2)//%f	有小数部分但无指数部分,如123.456
	fmt.Printf("s16对应类型是:%T, s16 = %q\n",s16 ,s16)
	var s3 string = fmt.Sprintf("%t",n3)//布尔值: %t	单词true或false
	fmt.Printf("s3对应类型是:%T, s3 = %v\n",s3 ,s3)
	var s4 string = fmt.Sprintf("%c",n4)//%c	该值对应的unicode码值
	fmt.Printf("s4对应类型是:%T, s4 = %v\n",s4 ,s4)
}
/*
执行结果
PS D:\golang\goproject\src\src01> go run demo11\main.go
s1对应类型是:string, s1 = 19
s2对应类型是:string, s2 = 4.780000
s16对应类型是:string, s16 = "4.780000"
s3对应类型是:string, s3 = false
s4对应类型是:string, s4 = a
*/

  

方式2
使用strconv 包的函数
package main
import (
	"fmt"
	"strconv"
)
func main() {
	var n1 int = 10
	var s1 string = strconv.FormatInt(int64(n1),10)//参数。第一个参数必须转为int64类型,第二个参数指定字面值得进制形式为10 进制
	fmt.Printf("s1对应类型是:%T, s1 = %v\n",s1 ,s1)
	var n2 float32 = 4.78
	var s2 string = strconv.FormatFloat(float64(n2),'f',9,32)//'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。控制精度(排除指数部分);32表示给的小数类型 
	fmt.Printf("s2对应类型是:%T, s2 = %v\n",s2 ,s2)
	var n3 bool = false
	var s3 string = strconv.FormatBool(n3)
	fmt.Printf("s3对应类型是:%T, s3 = %v\n",s3 ,s3)
//	var n4 byte = 'a'

}
执行结果
PS D:\golang\goproject\src\src01> go run demo12\main.go
s1对应类型是:string, s1 = 10
s2对应类型是:string, s2 = 4.780000210
s3对应类型是:string, s3 = false

  string 类型转基本数据类型

package main
import (
	"fmt"
	"strconv"
)
func main () {
	//string ----> bool
	var s1 string = "string"
	var b bool
	b,_ = strconv.ParseBool(s1)// 返回两个值
	fmt.Printf("b的类型是:%T,b=%v\n",b,b)
	var s2 string = "98"
	var n1 int64
	n1,_ = strconv.ParseInt(s2,10,64)//参数s2 表示字符串,10表示10进制,64表示转成的int64进制;指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64
	fmt.Printf("n1的类型是:%T,b=%v\n",n1,n1)
	var s3 string = "3.14"
	var n3 float64 
	n3,_=strconv.ParseFloat(s3,64)//参数s3 表示字符串,64表示转为float64 ,指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
	fmt.Printf("n3的类型是:%T,b=%v\n",n3,n3)
	//注意,string向基本数据类型转换的时候一定要确保string类型一定要确保能够转成有效的基本数据类型,否则最后结果是对应类型的默认值
	var s11 string = "golang"
	var b1 bool
	b1,_ = strconv.ParseBool(s11)
	fmt.Printf("b1的类型是:%T,b=%v\n",b1,b1)

}
/*
执行结果
PS D:\golang\goproject\src\src01> go run demo13\mian.go
b的类型是:bool,b=false
n1的类型是:int64,b=98
n3的类型是:float64,b=3.14
b1的类型是:bool,b=false
*/

  复杂数据类型指针

指针
基本数据类型和内存
C:\Users\尘曦>go run D:\golang\goproject\src\src01\demo14\main.go
0xc00000a0c8

指针变量
指针等于内存地址
总结
& 取内存结构
* 根据内存地址找到对应的值
package main
import (
	 "fmt"
)
func main(){
	var age int = 18
	//& + 变量就可以获取这个变量内存地址
	fmt.Println(&age)//打印age 的内存地址
	//执行结果
	//C:\Users\尘曦>go run D:\golang\goproject\src\src01\demo14\main.go
//0xc00000a0c8
//定义一个指针变量
//var 代表声明一个变量
//ptr 指针变量的名字
//ptr 对应的类型是*int是一个指针类型(指向int类型的指针)
//&age 就是一个地址,是ptr变量具体的值
	var ptr *int = &age
	fmt.Println(ptr)
	fmt.Println("ptr内存地址为:", &ptr)
	//获取ptr这个指针指向的变量值
	fmt.Println("ptr指向的数值为:",*ptr)
	/*执行结果
	 C:\Users\尘曦>go run D:\golang\goproject\src\src01\demo14\main.go
0xc00000a0c8
0xc00000a0c8
ptr内存地址为: 0xc000052030
ptr指向的数值为: 18
 */
}

  指针细节

通过指针修改变量的值
指针变量接收的一定是地址
指针变量的地址不可以跟变量类型不匹配
基本数据类型叫值类型,都有对应的指针类型,形式为*数据类型
测试
package main
import "fmt"
func main(){
	var num int = 10
	fmt.Println(num)
	var ptr *int = &num
	*ptr =20//通过指针修改变量的值
	fmt.Println(num)
	//指针变量接收的一定是地址
	/* var ptr1 *int =  num
	执行结果
	D:\golang\goproject\src\src01\demo15\main.go:10:19: cannot use num (variable of type int) as *int value in variable declaration
 */
	/* 指针变量的地址不可以跟变量类型不匹配
	var ptr1 *float32 = &num
	fmt.Println(*ptr1)
	执行结果
	D:\golang\goproject\src\src01\demo15\main.go:14:22: cannot use &num (value of type *int) as *float32 value in variable declaration
 */
    



}





执行结果
C:\Users\尘曦>go run D:\golang\goproject\src\src01\demo15\main.go
10
20

  标志符

标志符
标志符
变量,方法等,只要是其名字的地方,哪个名字就是标志符
标志符的定义规则
三个(组成部分),数字,字母,下划线;可以使用字符,但不建议
四个注意:不可以以数字开头要,严格区分大小写,不能包含空格,不可以使用go 语言的保留关键字
见名之意:增加可读性
下划线在go 语言是一个特殊符号,称为空标识符。可以代表任何其他的标识符,但是它对应的值会被忽略,所以仅能被作为占位符使用,不能单独使用
可以用如下,但是不建议 var int int = 90 (关键字不算保留字,但是也不建议使用)
长度无限制,但太长不建议
 

 关键字

关键字就是程序员发明者规定的有特殊含义的单词,又叫保留字;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
预定义标识符
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      print       println     real
recover     string      true        uint        uint8       uintprt


posted @ 2025-08-07 09:31  烟雨楼台,行云流水  阅读(14)  评论(0)    收藏  举报