Go(1)
生成二进制文件
go build helloworld.go
- go的注释
//阿巴阿巴
命令行参数
// gop1.io/ch1/echo1
// echo1 输出其命令行参数
package main
import (
"fmt"
"os"
)
func main() {
var s, sep string //1
for i := 1; i < len(os.Args); i++ {//2
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
}
//1用var 声明两个string变量,没有初始化就会是这个类型的空值
数字空值:0;字符串空值:"";
//2 := 短变量声明,会根据初始化的值给予合适的类型 ; 递增语句i++ 要注意的就不能j = i++ & --i
同时go语言中for是循环唯一的方式 但是有多种形态
第一版for
//一种for循环展示
for intialization(初始化); condition; post{
//零个或多个语句
}
不同点的话,两边不要小括号,同时花括号是必需的(左边的花括号必须在post的后面!!!)
//intialization&post可以去掉
//就很像传统的while语句
for condition{
//阿巴阿巴
}
当然也可以去掉condition
for {
//用break&return终止
}
第二版for
for在字符串或slice数据上迭代
// gog1.io/ch1/echo2
// echo2输出去命令行参数
package main
import (
"fmt"
"os"
)
func main() {
s, sep := "", ""
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
fmt.Println(s)
//fmt.Println(os.Args[0])
}
//go不允许有无用的的临时变量,但是可以用空标识符_(下划线)
这几个声明是等价的
s :="" //就喜欢短的,隐式 var s string //包级,显式, var s ="" var string =""
// gog1.io/ch1/echo2
// echo2输出去命令行参数
package main
import (
"fmt"
"os"
"strings"
)
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
找出重复行
第一版dup
输出标准输入中出现次数大于1的行,前面是次数
// gop1.io/ch1/dup1
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
counts := make(map[string]int)
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
counts[input.Text()]++
}
//注意:忽略input.Err()中可能的错误
for line, n := range counts {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
}
map存储键/值对集合 例子中键是string类型 值是int类型 感觉想php的数组
这里的make 是用来新建map,还有别的用处
用for去迭代map 序列是不一定的
Scanner:扫描器
input := bufio.NewScanner(os.Stdin)用短声明新建一个bufio.Scanner类型的input
//counts[input.Text()]++等价 line :=input.Text() counts[line]=counts[line]+1
工作流程:
imput.Scan()读取下一行->input.Text()获取读到的内容->Scan函数在读到新行的时候返回true,没有更多内容返回false
printf的格式化输出
%d //十进制整数 %x;%o;%b //十六进制、八进制、二进制整数 %f;%g;%e //浮点数 %t //布尔型 true false %c //字符 Unicode码点 %s //字符串 %q //带引号的字符串或字符("abc"&"c") %v //内置格式的任何值 %T //任何值的类型 %% //百分号本身
println默认是用%v再追加\n
GO基本概念
转义字符
(换书了)
\b 退格 \f 换页 \n \r 回车 \t 水平制表符 \v 垂直制表符
赋值
c&=2 c|=2
枚举
关键字 iota
变量
s :="" //就喜欢短的,隐式
var s string //包级,显式,
var s =""
var string =""
上面的
匿名变量
局部变量声明后必须使用,全局变量可以声明后不使用
package main
import (
"fmt"
)
func main() {
a := 1000
fmt.Print("hello world")
}
//报错:
// a declared and not used
空标识符_(下划线)

init函数
可以在init中全局声明 执行优先级高于main 不能手动调用init函数 每一个源文件只能有一个init函数
package main
import (
"fmt"
"math"
)
var Pi float64
func init() {
Pi = 4 * math.Atan(1)
}
func main() {
DPi := Pi * Pi
fmt.Println(Pi, DPi)
}
基础数据类型

浮点型
float32精确到小数后7位,float64精确到小数后15位,所以要注意==和!=的使用
math包中都要求接收float64,所以尽量有float64
复数
a+bi(a和b都是实数,类型为浮点数)的数叫复数
complex64 //32位实数和虚数
complex128 //64位实数和虚数
隐式声明的复默认为complex128类型
real()&imag()分别可以用来获取实部和虚部的数值
字符串&字符
len()返回一个字符串的字节数
非解释字符
用反引号括起来,支持换行
package main
import (
"fmt"
)
func main() {
str1 := `123\n123
123`
str2 := "321\n321"
fmt.Println(str1)
fmt.Println(str2)
}
/*
123\n123
123
321
321
*/
字符串比大小是看第一个字节的
遍历字符串的区别
package main
import (
"fmt"
)
func main() {
str := "我是字符串"
for i := 0; i < len(str); i++ {
fmt.Printf("%v ", str[i])
//fmt.Println(str[i])
}
fmt.Println("\n------------------------------")
for i := 0; i < len(str); i++ {
fmt.Printf("%c", str[i])
}
fmt.Println("\n------------------------------")
for _, v := range str {
fmt.Printf("%c", v)
}
}

字符串修改
[]byte&[]rune


strings包

strings.HasPrefix(str,"x") 查找字符串前缀是否有x strings.HasSuffix(str,"x") 查找字符串后缀是否有x strings.Contatins(str,"x") 查找字符串中是否有x strings.ContatinsAny(str,"x")

定位
strings.index(str,"abc") 返回x第一次出现的位置 strings.LastIndex(str,"x")返回x最后一次出现的位置 没有就返回-1 非ascii码: strings.IndexRune(str,"x")
替换
strings.Replace(str,old,new,n)

浙公网安备 33010602011771号