调用函数
1.要调用函数,需要输入函数名(本例中为Println),以及一对圆括号。

package main
import "fmt"
func main() {
fmt.Print("Hello, go")
}- 结果


2.使用其他包中的函数
Print函数是fmt(format.)包中的。
使用前需要 import “fmt” 导入
函数返回值。
- 与其他语言不同的是go函数的返回值可以有多个。
package main
import (
"fmt"
"math"
)
func main() {
floor := math.Floor(3.14)
fmt.Println(floor)
fmt.Print("Hello, go")
}如果变量定义出来没有使用,在go中是会报错的

结果

字符串
字符串是一系列字节,通常表示文本字符。你可以在代码中直接使用字符串字面量来定义字符串:双引号之间的文本,Go将把它们视为字符串。
在字符串中,换行符、制表符和其他难以包含在程序代码中的字符可以用转义序列来表示:反斜杠后跟表示另一个字符的字符。
符文
字符串字面量由双引号(”)包围,但rune字面量由单引号(’)包围。Go程序几乎可以使用地球上任何语言的任何字符,因为Go使用Unicode标准来存储rune。rune被保存为数字代码,而不是字符本身,如果你把rune传递给fmt.Println,你会在输出中看到数字代码,而不是原始字符。与字符串字面量一样,转义序列也可以用在rune字面量中,用来表示程序代码中难以包含的字符:
- 对应其他的语言的字符
布尔值
布尔值只能是两个值中的一个:true或false。它们对于条件语句特别有用,条件语句只在条件为true或false时才会导致代码段运行。
数字
Go将整数和浮点数视为不同的类型,因此请记住,可以使用小数点来区分整数和浮点数。
数学运算与比较
Go的基本数学运算符的工作方式与大多数其他语言一样。符号+表示加法,–表示减法,*表示乘法,/表示除法。
可以使用<和>来比较两个值,看看其中一个值是否小于或大于另一个值。可以使用==(这是两个等号)来查看两个值是否相等,以及!=(这是一个感叹号和一个等号,读作“不等于”)来查看两个值是否不相等。<=测试第二个值是否大于或等于第一个值,>=测试第二个值是否小于或等于第一个值。比较结果是一个布尔值,要么是true,要么是false。
类型
可以通过将任何值传递给reflect包的TypeOf函数,来查看它们的类型。
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Println(reflect.TypeOf(12))
fmt.Println(reflect.TypeOf(12.1))
fmt.Println(reflect.TypeOf("adsfads"))
fmt.Println(reflect.TypeOf('\n'))
fmt.Println(reflect.TypeOf(main))
}
声明变量
在Go中,变量是包含值的一块存储。可以使用变量声明为变量命名。只需使用var关键字,后跟所需的名称以及变量将保存的值的类型。
一旦你声明了一个变量,就可以用=(这是一个单等号)为它分配该类型的任何值:
package main import "fmt" func main() { var ina int ina = 1 fmt.Print(ina) }可以在同一语句中为多个变量赋值。只需将多个变量名放在=的左侧,将相同数量的值放在右侧,并使用逗号分隔。
package main import "fmt" func main() { var ina,inb int ina,inb= 1,2 fmt.Print(ina+inb) }如果你事先知道变量的值是什么,你可以声明变量并在同一行赋值
package main import "fmt" func main() { var ina,inb int = 1,2//int 可以省略 fmt.Print(ina+inb) }
短变量声明
如果你声明变量时就知道它的初始值是什么,那么更具有代表性的是使用短变量声明。你不必很明确地声明变量的类型并在之后使用=为其赋值,而是同时使用:=。
package main import "fmt" func main() { ina,inb := 1,2 fmt.Print(ina+inb) }
命名规则
Go有一套简单的规则,适用于变量、函数和类型的名称:·名称必须以字母开头,并且可以有任意数量的额外的字母和数字。
·如果变量、函数或类型的名称以大写字母开头,则认为它是导出的,可以从当前包之外的包访问它。(这就是为什么fmt.Println中的P是大写的:这样它就可以在main包或任何其他包中使用。)
如果变量/函数/类型的名称是以小写字母开头的,则认为该名称是未导出的,只能在当前包中使用。这些是该语言强制执行的唯一规则。
但是Go社区还遵循一些额外的约定:·如果一个名称由多个单词组成,那么第一个单词之后的每个单词都应该首字母大写,并且它们应该连接在一起,中间没有空格,比如topPrice、RetryConnection,等等。
(名称的第一个字母只有在你想从包中导出时才应大写。)这种样式通常称为驼峰大小写,因为大写字母看起来像驼峰。
·当名称的含义在上下文中很明显时,Go社区的惯例是缩写它:用i代替index,用max代替maximum,等等。(然而,在本书里我们认为,当你学习一门新语言时,没有什么是显而易见的,我们不会遵循那个惯例。)[插图]只有名称是以大写字母开头的变量、函数或类型才被认为是可导出的:可以从当前包之外的包访问。
- 与其他语言有很大区别。
转换
Go中的数学运算和比较运算要求包含的值具有相同的类型。如果不是的话,则在尝试运行代码时会报错。
解决方法是使用转换,它允许你将值从一种类型转换为另一种类型。只需提供要将值转换成的类型,后面紧接着是在圆括号中的要转换的值。
转换后查看类型
注释
大多数Go程序都在源代码中包含了它们是做什么的描述,目的是让维护程序的人员能够理解。编译器会忽略这些注释。
最常见的注释形式是用两个斜杠(//)标记的。从斜杠到行尾的所有内容都被视为注释部分。一条//注释可以单独出现在一行中,也可以出现在一行代码之后。
不太常用的注释形式是块注释,它跨越多行。块注释以/开始,以/结束,这些标记之间的所有内容(包括换行)都是注释部分。
从键盘输入
我们需要一种从程序的标准输入中读取(接收和存储)输入的方法,所有的键盘输入都使用标准输入。行reader:=bufio.NewReader(os.Stdin)将bufio.Reader保存在reader变量中,它可以帮我们做到这一点。
为了实际获得用户的输入,我们调用Reader的ReadString方法。ReadString方法需要一个带有rune(字符)的参数来标记输入的结束。我们想要读取用户输入的所有内容,直到他们按下
,所以我们给ReadString一个换行符。 >package main >import ( "bufio" "os" >) >func main() { reader:= bufio.NewReader(os.Stdin) readString, err := reader.ReadString('\n') println(err) println(readString) >}
函数或方法的多个返回值
在大多数编程语言中,函数和方法只能有一个返回值,但在Go中,它们可以返回任意数量的值。Go中多个返回值最常见的用法是返回一个额外的错误值,可以通过查询该错误值来确定函数或方法运行时是否发生了错误。
Go要求声明的每个变量都必须在程序的某个地方使用。如果我们添加了一个err变量,而不检查它,我们的代码将无法编译。未使用的变量通常表示一个bug,所以这是一个Go帮助你检测和修复bug的例子!
选项1:使用空白标识符忽略错误返回值
当我们有一个值时,通常会把它分配给一个变量,但我们不打算使用这个值时,我们可以使用Go的空白标识符。为空白标识符分配一个值实际上会丢弃它(同时让其他读你代码的人知道你正在这么做)。要使用空白标识符,只需在赋值语句中输入一个下划线(_)字符,通常在这里输入的是变量名。
package main import ( "bufio" "os" ) func main() { reader:= bufio.NewReader(os.Stdin) readString, _ := reader.ReadString('\n') println(readString) }
if条件语句
条件语句:只有在满足某个条件时,才导致代码块(一个或多个由花括号{}包围的语句)被执行的语句。计算表达式,如果结果为true,则执行条件块体中的代码。如果为false,则跳过条件块。
当你仅在条件为假时才需要执行代码时,可以使用!布尔求反运算符,它允许你获取一个真值并使其为假,或者获取一个假值并使其为真。
如果只希望在两个条件都为真时运行一些代码,可以使用&&(“与”)运算符。如果你想让它在两个条件之一为真时运行,你可以使用||(“或”)运算符。
有条件地记录致命错误
我们知道,如果err变量中的值为nil,则表示从键盘读取成功。现在我们了解了if语句,让我们尝试更新代码以记录错误,并仅在err不为nil时退出。
package main import ( "bufio" "log" "os" ) func main() { reader:= bufio.NewReader(os.Stdin) readString, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } println(err) println(readString) }
err 与 error
命名一个error变量是一个坏主意,因为它会遮盖一个名为error的类型的名称。
声明变量时,应确保它与任何现有的函数、包、类型或其他变量的名称不同。如果在封闭范围内存在同名的东西(稍后我们将讨论作用域),则你的变量将对它进行遮盖,也就是说,优先于它。而这往往是一件坏事。
将字符串转换为数字
条件语句还允许我们评估输入的分数。让我们添加一个if/else语句来确定分数是及格还是不及格。如果输入的百分比分数为60或更高,我们会将状态设置为“及格”。否则,我们将设置为“不及格”。
package main import ( "bufio" "log" "os" "strconv" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) readString, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } float, err := strconv.ParseFloat(strings.TrimSpace(readString),64) if err != nil { log.Fatal(err) } if float > 60 { print("及格") }else { print("不及格") } }
- strings包有一个TrimSpace函数,它将删除字符串开头和结尾的所有空白字符(换行符、制表符和常规空格)。
- 现在input字符串中应该保留的是用户输入的数字。我们可以使用strconv包的ParseFloat函数将其转换为float64值。
代码段
Go代码可以分为块,即代码段。块通常由大括号({})包围,尽管在源代码文件和包级别也有块。块可以彼此嵌套。
·packageVar的作用域是整个main包。你可以在包中定义的任何函数内的任何位置访问packageVar。
·functionVar的作用域是它声明所在的整个函数,包括嵌套在该函数中的if块。
·conditionalVar的作用域仅限于if块。当我们试图在if块的右大括号之后访问conditionalVar时,我们将收到一个错误,说conditionalVar未定义!
for循环语句
循环总是以for关键字开头。在一种常见的循环中,for后面跟着三段控制循环的代码:
·一个初始化(或init)语句,通常用于初始化一个变量·
一个条件表达式,用于决定何时中断循环·
一个标志(post)语句,在循环的每次迭代之后运行
通常,初始化语句用于初始化一个变量,条件表达式保持循环运行,直到该变量达到某个值,标志(post)语句用于更改该变量的值。
例如,在这个代码段中,t变量初始化为3,条件保持循环在t>0时继续运行,并且每次循环运行时标志(post)语句都会从t中减去1。最终,t达到0时,循环终止。

初始化和标志(post)语句是可选的
如果你愿意,可以从for循环中省略初始化和标志(post)语句,只留下条件表达式(尽管你仍然需要确保条件的最终计算结果为false,或者你的手上可能有一个无限循环)。
与条件语句一样,循环块中声明的任何变量的作用域都仅限于该块(虽然初始化语句、条件表达式和标志(post)语句也可以被认为是该作用域的一部分)。
- 所以go语言中没有while。
9*9乘法表
package main
func main() {
for a:=1;a<10;a++ {
for b:=1;b<=a;b++ {
print(a,"*",b,"=", a*b,"\t")
}
println()
}
}
使用“continue”和“break”跳过部分循环
Go提供了控制循环流的两个关键字。第一个continue,立即跳转到循环的下一个迭代,而不需要在循环块中运行任何其他代码。
第二个关键字break立即跳出循环。不再执行循环块中的代码,也不再运行进一步的迭代。执行移动到循环之后的第一个语句。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!












