/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 for source 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
package main
func main(){
println("hello")
}
println
函数不常用,可以用 fmt.Println
, 输入 fmt.pl
即可补全
package main
import "fmt"
func main() {
fmt.Println("hello")
}
运行 go run .
/w/hello # ❯❯❯ go build .
/w/hello # ❯❯❯ ./hello-go
hello
/w/hello # ❯❯❯ go run .
hello
编译到 Windows
命令
GOOD=windows GOARCH=amd64 go build -o hello-go.exe
var a int = 42
var b, c int = 1, 2
var (
a1 int = 42
b1, c1 int = 1, 2
)
:=
反而不能指定了类型, 但是用的人更多
d := 100
e, f := 200, 300
自己测试
package main
import "fmt"
func main() {
var a = 1
var b, c = 1, 2
var (
d = 1
f = 3
)
fmt.Println(a, b, c, d, f)
}
const (
C0 = iota
C1
C2
)
fmt.Println(C0, C1, C2) // "0 1 2"
猜猜结果
const (
C1 = iota + 1
C2
C3
)
fmt.Println(C1, C2, C3)
// 1 2 3
const (
C1 = iota + 1
_
C3
C4
)
fmt.Println(C1, C3, C4)
// 1 3 4
const (
C1 = 1 << iota
C2
C3
C4
)
fmt.Println(C1, C2, C3, C4)
// 1 2 4 8
iota 即希腊字母 ι
i := 1
for i <= 3 {
fmt.Println(i)
i++
}
for j := 1; j <= 3; j++ {
fmt.Println(j)
}
k := 1
for {
if k > 3 {
break
}
fmt.Println("可能无限循环")
k++
}
跟 JS 不一样的地方
if num := 9; num < 0 {
fmt.Println(num, "负数")
} else if num < 10 {
fmt.Println(num, "一位数")
} else {
fmt.Println(num, "多位数")
}
跟 JS 不一样的地方
switch time.Now().Weekday() {
case time.Saturday, time.Sunday:
fmt.Println("休息日")
default:
fmt.Println("工作日")
}
var i any = true
switch t := i.(type) {
case bool:
fmt.Println("布尔")
case int:
fmt.Println("整数")
default:
fmt.Printf("未知类型 %T\n", t)
}
与 JS 不一样的地方
func f1(x, y int) (int, int) {
return x + y, x * y
}
func f2(x, y int) (sum, product int) {
sum = x + y
product = x * y
return
}
func main() {
a, b := f1(3, 4)
c, d := f2(5, 6)
fmt.Println(a, b, c, d)
}
自己练习
package main
import (
"fmt"
)
func add(a int, b int) int {
return a + b
}
func main() {
var add2 = func(a, b int) int {
return a + b
}
fmt.Println(add2(1, 2))
add(1, 2)
}
package main
import (
"fmt"
)
func add(a int, b int) int {
return a + b
}
func main() {
i := func(a, b int) int {
return a + b
}(1, 2)
fmt.Println(i)
add(1, 2)
}
func sum(numbers ...int) int {
total := 0
for _, n := range numbers {
total += n
}
return total
}
func main() {
fmt.Println(sum(1, 2))
fmt.Println(sum(1, 2, 3))
nums := []int{1, 2, 3, 4}
fmt.Println(sum(nums...))
}
func main() {
sum := func(a, b int) int {
return a + b
}
fmt.Println(sum(1, 2))
}
func(c int) {
fmt.Println(c)
}(3)
与 JS/TS 不一样的地方
简单值类型
复杂值类型
引用类型
package main
import (
"fmt"
)
func main() {
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")
}
}
type Point struct{ X, Y int }
p1 := Point{1, 2}
fmt.Println(p1.X, p1.Y)
p2 := Point{X: 3, Y: 4}
fmt.Println(p2.X, p2.Y)
自己练习
package main
import "fmt"
type User struct {
Username string
Age int
}
func main() {
u := User{Username: "zkeq", Age: 18}
u2 := User{Username: "test", Age: 19}
u3 := User{"zkeq", 20}
fmt.Println(u, u2, u3, u.Username, u.Age)
}
type Point struct{ X, Y int }
func modify(p Point) {
p.X = 42
}
func main() {
p1 := Point{1, 2}
modify(p1)
fmt.Println(p1)
}
// A {42, 2}
// B {1, 2}
实在要改的话可以这样改
package main
import "fmt"
type Point struct{ X, Y int }
func modify(p *Point) {
(*p).X = 42
// p.Y = 42 也可以 直接取, 是一个 语法糖
}
func main() {
p1 := Point{1, 2}
modify(&p1)
fmt.Println(p1)
}
用于类型
var a *int
表示 a
存 int
的地址a
为指针用于值
&b
表示 b
的地址*c
表示指针 c
对应的值讲师: 我个人认为,用 var a &int 表示 a 存 int 的地址,更符合语义
type Point struct{ X, Y int }
func modify(p *Point) {
(*p).X = 42 ---> 语法糖 p.X = 42
}
func main() {
p1 := Point{1, 2}
modify(&p1)
fmt.Println(p1)
}
与 JS 的不同之处
function x(o){
o.name = 'xxx'
}
const obj = {
name: 'zkeq'
}
x(obj)
console.log(obj)
// { name: 'xxx' } // js 会自己传地址
type User struct {
ID string `json:"id"` // json 标记 key 的大小写规定
UserName string `json:"username"`
Email string `json:"email"`
}
func main() {
u := User{
ID: "1",
UserName: "test",
Email: "test@test.com",
}
bytes, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
a := [5]int{1, 2, 3}
a[1] = 20
fmt.Println(a) // [1 20 3 0 0]
自己练习
package main
import (
"fmt"
)
func main() {
a := [...]int{1, 2, 3}
a[1] = 20
fmt.Println(a, len(a)) // [1 20 3 0 0]
}
不怎么用到数组, 不怎么关注就行了
与 JS
的不同之处
JS
的数组进行类比len(a)
获取数组的长度,而不是 a.length
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。