go mod init github.com/frankfang/hello 用于初始化目录 如果没有看到 go.mod,点击 Refresh Explorer
创建 main.go
go build . && ./hello 你也可以用 go run . 代替这两句话
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/w/hello # ❯❯❯ go version go version go1.20.3 linux/amd64 /w/hello # ❯❯❯ pwd /workspace/hello /w/hello # ❯❯❯ go mod init go: cannot determine module path forsource directory /workspace/hello (outside GOPATH, module path must be specified)
Example usage: 'go mod init example.com/m' to initialize a v0 or v1 module 'go mod init example.com/m/v2' to initialize a v2 module
Run 'go help mod init'for more information. /w/hello # ❯❯❯ go mod init github.com/zkeq/hello-go ✘ 1 go: creating new go.mod: module github.com/zkeq/hello-go
创建 main.go
1 2 3 4 5
package main
funcmain(){ println("hello") }
println 函数不常用,可以用 fmt.Println, 输入 fmt.pl 即可补全
1 2 3 4 5 6 7
package main
import"fmt"
funcmain() { fmt.Println("hello") }
运行 go run .
1 2 3 4 5
/w/hello # ❯❯❯ go build . /w/hello # ❯❯❯ ./hello-go hello /w/hello # ❯❯❯ go run . hello
编译到 Windows 命令
1
GOOD=windows GOARCH=amd64 go build -o hello-go.exe
Go 语法
变量
1 2 3 4 5 6
var a int = 42 var b, c int = 1, 2 var ( a1 int = 42 b1, c1 int = 1, 2 )
:= 反而不能指定了类型, 但是用的人更多
1 2
d := 100 e, f := 200, 300
自己测试
1 2 3 4 5 6 7 8 9 10 11 12 13
package main
import"fmt"
funcmain() { var a = 1 var b, c = 1, 2 var ( d = 1 f = 3 ) fmt.Println(a, b, c, d, f) }
k := 1 for { if k > 3 { break } fmt.Println("可能无限循环") k++ }
for 循环特点
跟 JS 不一样的地方
不加 ( ),加了会被删
for 接 0 个表达式等价于 JS 的 while(true)
for 接 1 个表达式等价于 JS 的 while(condition)
for 接 3 个表达式等价于 JS 的 for(初始化, 判断, 后续)
if else
1 2 3 4 5 6 7
if num := 9; num < 0 { fmt.Println(num, "负数") } elseif num < 10 { fmt.Println(num, "一位数") } else { fmt.Println(num, "多位数") }
if else 特点
跟 JS 不一样的地方
推荐不加 ( )
if 接一个表达式等价于 JS 的 if(condition)
if 接两个表达式没有等价的 JS 常见写法
switch case
1 2 3 4 5 6
switch time.Now().Weekday() { case time.Saturday, time.Sunday: fmt.Println("休息日") default: fmt.Println("工作日") }
switch case 判断类型
1 2 3 4 5 6 7 8 9
var i any = true switch t := i.(type) { casebool: fmt.Println("布尔") caseint: fmt.Println("整数") default: fmt.Printf("未知类型 %T\n", t) }
switch case 特点
与 JS 不一样的地方
不推荐加 ( )
不要加 break
一个 case 可以有多个值,用逗号隔开
函数
1 2 3 4 5 6 7 8 9 10 11 12 13
funcf1(x, y int) (int, int) { return x + y, x * y } funcf2(x, y int) (sum, product int) { sum = x + y product = x * y return } funcmain() { a, b := f1(3, 4) c, d := f2(5, 6) fmt.Println(a, b, c, d) }
函数里面不能声明有名字的函数
自己练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package main
import ( "fmt" )
funcadd(a int, b int)int { return a + b }
funcmain() { var add2 = func(a, b int)int { return a + b }
fmt.Println(add2(1, 2)) add(1, 2) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package main
import ( "fmt" )
funcadd(a int, b int)int { return a + b }
funcmain() { i := func(a, b int)int { return a + b }(1, 2)
fmt.Println(i) add(1, 2) }
可变参数函数
1 2 3 4 5 6 7 8 9 10 11 12 13
funcsum(numbers ...int)int { total := 0 for _, n := range numbers { total += n } return total } funcmain() { fmt.Println(sum(1, 2)) fmt.Println(sum(1, 2, 3)) nums := []int{1, 2, 3, 4} fmt.Println(sum(nums...)) }
匿名函数
1 2 3 4 5 6
funcmain() { sum := func(a, b int)int { return a + b } fmt.Println(sum(1, 2)) }
1 2 3
func(c int) { fmt.Println(c) }(3)
函数特点
与 JS/TS 不一样的地方
返回值可以提前定义名字,return 可缩写 - numbers ...int 表示多个 int 参数组成的数组
funcmain() { var a int64 = 64// int 多少位跟操作系统有关 var b uint64 = 64 var f float64 = 64 var f2 float64 = 64.0// float 一般是64位 f3 := 64.0 var c complex64 = 1 + 2i fmt.Println(a, b, f, f2, f3, c)
var s string = "hello" s1 := "hello" s2 := 'h'// int32 fmt.Println(s, s1, s2)
// 打印 s2 fmt.Printf("%c\n", s2)
n := true if n { // n 只能是布尔, 不能是字符串 或者 nil fmt.Println("n is true") } else { fmt.Println("n is false") } }