golang-基础
Posted quguanwen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang-基础相关的知识,希望对你有一定的参考价值。
1.go的特点
兼具动态语言的开发效率与C,C++,java的性能安全性 ,内置编译器
2.go的安装
go的sdk下载: https://studygolang.com/dl
go的IDE下载: https://www.jetbrains.com/go/
3.go run与go build
go run 编译后直接执行
go build 编译成二进制文件 ,源码文件会小于编译文件 ,编译文件包含了其他依赖
4.数据类型
数据类型是让编程语言,编译器,数据库,代码环境知道如何去操作处理数据的
强类型语言:错误的使用数据类型将会报错 ,数据类型变换需要强制转换(go,python)
弱类型语言:为了程序的执行,在运行时将一种数据类型转换为另一种(bash-shell ,js)
静态语言:编译执行性能高 ,编译器检查数据类型正确, 安全性与性能(go)
动态语言:快速的开发效率 ,可移植性和兼容性好 ,简单与开发速度(python)
5.go声明变量
显示声明:全局变量必须使用显示声明 ,也可用于函数中
简短声明:函数内变量多使用简短声明 ,不用于全局
6.go的内置基本数据类型
布尔类型 :在go中布尔值仅仅是 "true" 和 "false" ,任何零值都无法作为布尔值直接判断
数值类型 :整形带符号int和不带符号uint ,带符号是首位0,1用来表示符号有无 ,go中是用int会自动判断是int64还是int32
浮点型单精度双精度浮点数 ,float32和float64
字符串类型 :string
数组 :go的数组是类型和长度固定的
7.检查变量的类型
标准库的reflect包
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 func main() { 9 a := 1 10 b:= "1" 11 c := true 12 d := [3]string{"1","2","3"} 13 fmt.Println(a,reflect.TypeOf(a)) 14 fmt.Println(a,reflect.TypeOf(b)) 15 fmt.Println(a,reflect.TypeOf(c)) 16 fmt.Println(a,reflect.TypeOf(d)) 17 }
8.数值类型转换
整数与浮点的转换
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 func main() { 9 i := 1 10 n := 2.7 11 fmt.Println(i,reflect.TypeOf(i),n,reflect.TypeOf(n)) 12 i1 := float64(i) 13 n1 := int(n) 14 fmt.Println(i1,reflect.TypeOf(i1),n1,reflect.TypeOf(n1)) 15 }
浮点数的计算问题处理
浮点数存储在内存时 ,此方不能精准表示小数部分 使用第三方decimal包来解决
package main import ( "fmt" "github.com/shopspring/decimal" ) func main() { var m,n float64 = 14.1,13.5 //浮点数存储在内存,次方不能精准表示浮点数就会出现偏差 (除法乘法问题) fmt.Println(m-n) fmt.Println(m*n) fmt.Println(m/n) fmt.Println(m+n) q1 := decimal.NewFromFloat(m).Sub(decimal.NewFromFloat(n)) q2 := decimal.NewFromFloat(m).Add(decimal.NewFromFloat(n)) q3 := decimal.NewFromFloat(m).Mul(decimal.NewFromFloat(n)) q4 := decimal.NewFromFloat(m).Div(decimal.NewFromFloat(n)) fmt.Println(q1,q2,q3,q4) }
字符串与整型之间的转换 使用标准库的strconv包
字符串转整数可能会出现异常 ,根据go的错误处理机制 ,调用者需要接收错误处理 ,所以Atoi函数有两个返回值接收
package main import ( "fmt" "reflect" "strconv" ) func main() { str1 := "192" int1 := 192 fmt.Println(str1, reflect.TypeOf(str1), int1, reflect.TypeOf(int1)) str2, err := strconv.Atoi(str1) fmt.Println(str2, reflect.TypeOf(str2), err) //str2是字符串被转换为整型 int2 :=strconv.Itoa(int1) fmt.Println(int2, reflect.TypeOf(int2), err) //int2是整数被转为字符串 }
Parse类函数 :将string转换为其他类型(bool int float uint)
base: 转换为多少进制 basesize: 转化为多少位
返回的错误由" _ "黑盒子收走
package main import ( "fmt" "reflect" "strconv" ) func main() { a, b, c, d := "true", "-12", "10", "3.14" a1, _ := strconv.ParseBool(a) b1, _ := strconv.ParseFloat(d, 64) //指定转为64或32类型 c1, _ := strconv.ParseInt(b, 10, 64) //指定base:进制,basesize:64或43 d1, _ := strconv.ParseUint(c, 10, 64) //指定base:进制,basesize:64或43 fmt.Println(reflect.TypeOf(a1), reflect.TypeOf(b1), reflect.TypeOf(c1), reflect.TypeOf(d1)) }
Format类函数 :将其他类型转换为string类型
base: 转换为多少进制 basesize :64
只能对int64 ,float64 ,uint64做转换 ,其中浮点转为字符串会格式化
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 "strconv" 7 ) 8 9 func main() { 10 var ( 11 a bool = true 12 b int64 = -12 13 c uint64 = 6 14 d float64 = 3.14 15 ) 16 a1 := strconv.FormatBool(a) 17 b1 := strconv.FormatInt(b, 10) 18 c1 := strconv.FormatUint(c, 10) 19 d1 := strconv.FormatFloat(d, ‘E‘, -1, 64) 20 fmt.Println(reflect.TypeOf(a1), reflect.TypeOf(b1), reflect.TypeOf(c1), reflect.TypeOf(d1), ) 21 }
9.变量
变量由字母数字下划线组成 ,开头不能是数字
声明变量:关键字var声明 ,快速声明 ,简短声明
1 package main 2 3 var StartNum int = 1970 //var声明 4 func main() { 5 var ( //快速声明 6 a string = "a" 7 b string = "b" 8 ) 9 c,d,e:= 1,2,3 //简短声明 (只能在函数中使用) 10 //...... 11 }
10.零值
变量声明不赋值 ,此时等于该类型的零值
不同数据类型零值不同: bool(false) ,int(0) ,float(0.0) ,string("") ,剩下的slice ,array ,map ,function ,interface ,pointer..都是nil
对于复合类型 ,go会对每个元素初始化为其零值
判断变量是否赋值 ,可以检查它是否等于该类型的零值!!!
11.常量
常量就是本次编译后无法在程序运行中改变的量
const StartTime int = 1970 #StartTime就是常量
12.变量的作用域
go中一个大括号 "{}" 就是一个块 ,在块内声明变量 ,该块内任意使用 (go的文件也是块 ,相当于声明全局变量)
对于嵌套块来说 ,内部块可以访问外部块变量 ,外部块无法访问内部块变量
13.指针
指针也是一种类型pointer ,用来存储变量内存地址
go语言中 ,如果直接赋值 ,或将变量传到函数 ,就会开辟内存复制副本
指针可以指向原有变量访问 ,而无需复制副本 ,指针引用会修改源值 ,值引用不会
创建指针 : prt := &变量 #其中&可以获得变量的内存地址
使用指针 : *ptr #获得指针指向的变量的值
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := []int{} 7 a = append(a, 1, 2, 3, 4) 8 ptra := &a #创建指针存储a的内存 9 vala := a #创建a的副本 10 fmt.Printf("a内存地址为%p,ptra内存地址为%p,vala内存地址为%p", &a, &*ptra, &vala) 11 }
以上是关于golang-基础的主要内容,如果未能解决你的问题,请参考以下文章