Go 语言中的Scan 与 Scanf 和 Scanln
类似java中的scanner功能相似,在GO中也是在fmt包中
fmt.Scan
输入:读取以空白字符分割的值,返回到地址中进行修改,换行视为空白符
返回值:错误处理,返回值中有一个Int类型的值是返回正确的数量,有一个err是错误的原因
package main
import "fmt"
func main() {
var (
name string
age int
money float64
)
n, err := fmt.Scan(&name, &age, &money)
if err != nil {
fmt.Println("错误:", err, "成功的数量:", n)
} else {
fmt.Println(n, name, age, money)
}
}
fmt.Scanln
Scanln 类似 Scan,但它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。使用场景就是只要换行就结束。
返回错误和Scan一样。
package main
import (
"fmt"
)
func main() {
var (
name string
age int
money float64
)
n, err := fmt.Scanln(&name, &age, &money)
if err != nil {
fmt.Println("错误:", err, "成功的数量:", n)
} else {
fmt.Println(n, name, age, money)
}
}
fmt.Scanf
格式化读入,暗含强制类型转换
Scanf扫描从标准输入读取的文本,将空格分隔的连续值存储到由格式决定的连续参数中。
package main
import (
"fmt"
)
func main() {
var (
name string
age int
money float64
)
n, err := fmt.Scanf("%s %d %f", &name, &age, &money)
if err != nil {
fmt.Println("错误:", err, "成功的数量:", n)
} else {
fmt.Println(n, name, age, money)
}
}
Go语言变量作用域
作用域:已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
Go语言中变量可以在三个地方声明:
。局部变量:函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部全局变量: 函数外部声明/定义的变量叫全局变量,可以在整个包甚至外部包(导出)中使用。全局变量和局部变量的名称可以相同,但是函数内会优先使用局部变量。
参数变量:在函数中,作为局部变量来使用。
局部变量 localvariable
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量
注意点:局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。
package main
import (
"fmt"
)
var age int = 20
var name string = "zhangsan"
func test() {
age := 10
name := "lisi"
fmt.Println("age=", age)
fmt.Println("name=", name)
}
func main() {
fmt.Println("age=", age)
fmt.Println("name=", name)
fmt.Println("--------------------------------------------")
test()
}
全局变量 globalvariable
定义:函数外部定义的变量都属于全局变量; 全局变量声明必须以 var 开头生效范围:
当前 package 内如果想要其他 package 访问,全局变量以大写开头
入口文件:main.go
package main
import (
"Go/utils"
"fmt"
)
func main() {
//调用utils包内的全局变量Watch
fmt.Println(utils.Watch)
//调用utils包内的Hello函数
utils.Hello()
}
utils包内文件:hello.go
package utils
// 全局变量hello
var hello string = "hello world"
utils包内文件:tool.go
package utils
import (
"fmt"
"time"
)
var Watch string = time.Now().String()
var watch string = time.Now().String()
func Hello() {
//同一个包内调用全局变量hello
fmt.Println(hello)
}
参数变量 parameter variable
定义:函数调用时传递的变量 生效范围:函数范围
在定义函数时函数名后面括号中的变量叫做形式参数 (简称形参)
特别重要:形式参数只在函数调用时才会生效函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值
形式参数会作为函数的局部变量来使用
package main
import "fmt"
var a int = 30
func main() {
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main函数中 a = %d \n", a)
fmt.Println("------------------------------------------")
c = sum(a, b)
fmt.Println("------------------------------------------")
fmt.Printf("main函数中 c = %d \n", c)
}
func sum(a, b int) int {
fmt.Printf("sum函数中 a = %d \n", a)
fmt.Printf("sum函数中 b = %d \n", b)
return a + b
}
OS包基础用法
package main
import (
"fmt"
"os"
)
var a int = 30
func main() {
dir, err := os.UserConfigDir()
if err != nil {
fmt.Println(err)
} else {
fmt.Println(dir)
}
}
整蛊小程序:在桌面爬取图片
package main
import (
"bufio"
"fmt"
"io"
"net/http"
"os"
"strconv"
)
var imageURL string = "https://img2.baidu.com/it/u=1576394190,501333334&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=581"
func getImage(path string) {
res, err := http.Get(imageURL)
if err != nil {
return
}
defer res.Body.Close()
reader := bufio.NewReader(res.Body)
file, err := os.Create(path)
if err != nil {
panic(err)
}
writer := bufio.NewWriter(file)
written, err := io.Copy(writer, reader)
if err != nil {
panic(err)
} else {
fmt.Println(written)
}
}
func main() {
userHomePath, err := os.UserHomeDir()
if err != nil {
return
} else {
deskTopPath := "\\Desktop"
for i := 0; i < 50; i++ {
getImage(userHomePath + deskTopPath + "\\林志玲" + strconv.Itoa(i) + ".jpeg")
}
}
}