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)
__EOF__

本文链接:https://www.cnblogs.com/Map1eaf/p/17218192.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)