Go语言学习笔记(二)
1 命令行参数
大部分的程序处理输入,然后产生输出,这就是关于计算的定义,数据的输入可以是程序自己产生,但大部分时候程序的输入来自于外部源:文件、网络连接、其他程序的输出、键盘、命令行参数等
1.1 os.Args
Go语言中的os包提供一些函数和变量,以与平台无关的方式和操作系统打交道。命令行参数以os包中的Args名字的变量供程序访问,在os包外面,使用os.Args这个名字。
-
os.Args
是一个字符串slice
;
-
slice
是Go
中的基础概念,可以理解为是一个动态容量的顺序数组。我觉得可以理解为python
中的列表类型,因为他支持python
中对列表的操作(分片等);
-
os.Args
第一个元素os.Args[0]
是命令本身的名字;另外的元素(os.Args[1:]
/os.Args[1:len(os.Args)]
)是程序开始时执行时的参数。
一个简单的输出Args
的程序如下:
//例1
package main
import (
"fmt"
"os"
)
func main(){
var s,seq string
for i := 1; i < len(os.Args); i++ {
s += seq + os.Args[i]
seq = " "
}
fmt.Println(s)
}
2.Go数据类型
2.1类型简介
正如上一篇笔记中所说,Go语言不支持数据类型的转换,是静态类型的语言,所以理解Go语言的数据类型很有必要
2.2常见类型声明
Go语言常见的声明有func、var、const、type等
var
关键字声明变量,变量可以在声明的时候初始化。如果没有明确的初始化,将隐式地初始化变量为类型的空值,var b bool
,此时的b
的值为false
,数字类型未初始化为0,字符串未初始化为空字符串。- 在参考书籍[1]中,将类型分为了布尔类型和数值类型
2.3 常见类型
2.3.1 布尔类型
bool
类型不像C或者别的语言一样可以用数字表示(0为false
,其他为true
),在Go语言中,bool类型的值只能是false
或true
,布尔类型的变量声明可以这样声明:
var b bool
<变量> <变量名> <变量类型>
对了这里要注意的是:Go语言不需要在语句或声明后面使用分号结尾,除非有多个语句或声明出现在同一行。
Q: 那么变量如何初始化呢?
A: var <变量名> <变量类型> = <变量初值> 如下:
var b bool = true
因为Go语言是静态类型的语言,所以,它不支持将布尔类型的变量转换为0、1这样的数字类型
2.3.2 数值类型
Go语言中常见的数值类型如整数、浮点数、字符串和数组。
定义整数和浮点数的方式如下:
var i int = 3
//go语言的浮点数可以是32位(float32)的,也可以是64位的。现代大多数计算机使用64位
var f float64 = 0.111
整数类型和浮点数类型过于简单,笔记没有。
2.3.2.1 字符串类型
字符串类型变量声明如下:
var s string = "foo"
var s string = ""
var s string = ""
s += "foo"
当+
用于数字类型的操作时,是算术和逻辑操作符;当’+'用于字符串类型时,执行追加操作(类似python中的+对字符串的操作
),不能对字符串执行数学运算,必须先将其转换为数字类型。
2.3.2.2 数组
数组类型变量声明如下:
var beatles [4] string
beatles[0] = "John"
…… ……
beatles[3] = "George"
2.4 检查变量的类型
在python中我们可以使用type(变量名)来得到变量的类型,在C++中有typeid(变量名).name()来获得变量的类型,Go语言也有类似的机制
我们可以使用标准库中的reflect
包来实现,它能帮助我们访问变量的底层类型
package main
import (
"fmt"
"reflect"
)
func main(){
var s string = "string"
var i int = 56
var f float64 = 1.2
fmt.Println(reflect.TypeOf(s))//输出string
fmt.Println(reflect.TypeOf(i))//输出int
fmt.Println(reflect.TypeOf(f))//输出float64
}
2.5类型转换
将数据从一种类型转换成另一种类型是常见的编程任务,这通常是在从网络或数据库中读取数据时进行的。Go标准库提供了良好的类型转换支持。strconv包提供了一整套类型转换方法,可用于转换为字符串或将字符串转换为其他类型。
以下是一些简单的例子:
//字符串转布尔值
var s string = "true"
b,err := strconv.ParseBool(s)
//布尔值转字符串
s = strconv.FormatBool(true)
fmt.Println(s)
这里的:=是短变量声明
一个详细的实例如下:
package main
import (
"fmt"
"reflect"
"strconv"
)
func main() {
var s string = "true"
b, err := strconv.ParseBool(s)
fmt.Println(b)//输出true
fmt.Println(reflect.TypeOf(b))//输出bool
fmt.Println(err)//输出<nil>
s = strconv.FormatBool(true)
fmt.Println(s)//输出true
}
Go中的nil
相当于其他语言的Null
、None
等
参考书籍
[1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译
[2]: 【Go程序设计语言】黑砖
题外话:
- 我刚刚发现原来博主访问自己的文章也能算作访问量,emm,个人觉的可以把这一项删掉