【Golang入门】Golang第一天心得

生活所迫,入门一下Go

  1. 很奇葩的第一点,接口
go 复制代码
package main

import (
    "fmt"
)

// 定义一个接口
type Shape interface {
    Area() float64
}

// 定义一个矩形类型
type Rectangle struct {
    Width  float64
    Height float64
}

// 矩形类型实现Shape接口的Area方法
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

// 定义一个圆形类型
type Circle struct {
    Radius float64
}

// 圆形类型实现Shape接口的Area方法
func (c Circle) Area() float64 {
    return 3.14159265359 * c.Radius * c.Radius
}

func main() {
    // 创建一个矩形对象
    rectangle := Rectangle{Width: 4, Height: 5}
    // 创建一个圆形对象
    circle := Circle{Radius: 3}

    // 使用接口来计算不同形状的面积
    shapes := []Shape{rectangle, circle}
    for _, shape := range shapes {
        fmt.Printf("Area of the shape is: %.2f\n", shape.Area())
    }
}

gpt这么解释: Go语言中的接口实现是隐式的,而不是明确的。这意味着你不需要显式声明一个类型实现了某个接口,只要这个类型提供了接口中定义的所有方法,它就被认为实现了该接口。这是Go语言的一种灵活而简洁的设计。

  1. 奇葩的第二点:没有for in,但是有range
    奇葩的第三点:数组的写法
go 复制代码
func main() {
	rec := Rectangle{width: 2.0, height: 3.0}
	cir := Circle{radius: 2.0}

	shapes := []Shape{rec, cir}
	for index, shapes := range shapes {
		fmt.Println(index, shapes.Area())
	}

}
  1. 奇葩的第四点:方法依靠方法名决定权限:public or private
    大写开头的方法为public,可以被外部调用;小写开头则为private,不能被外部调用
    ● 如果方法名以大写字母开头(例如GetName),则该方法是公开的,可以在包外部访问。
    ● 如果方法名以小写字母开头(例如calculate),则该方法是私有的,只能在同一包内部访问,不能在包外部访问。
go 复制代码
package shape

func Description(name string) string {
	return "The person name is: " + name
}
func secretName(name string) string {
	return "Do not share"
}

4 . 奇葩第五点:错误处理。这一点也是早有耳闻了。

go 复制代码
func main() {
	resp, err := http.Get("http://example.com")
	if err != nil {
		fmt.Println(err)
		//return
	}

	fmt.Println(resp)
	num := 5
	if inc, err := Increment(num); err != nil {
		fmt.Printf("failed number: %v, error message: %v\n", inc, err)
	} else {
		fmt.Printf("increment successfully, num is %v \n", inc)
	}
}

func Increment(n int) (int, error) {
	if n < 0 {
		return n, errors.New("error")
	}

	return n + 1, nil
}
  1. go最精彩的点:Go routine, 可以与另一个函数并发执行
go 复制代码
func main() {
	go task()
	fmt.Println("main")
	time.Sleep(time.Second * 2)

}

func task() {
	fmt.Println("concurrent")
}

go channel:在两个go routine之间传递数据。 写法也挺怪的。

go 复制代码
package main

import "fmt"

func main(){
  c := make(chan string) // 创建channel, 可以发送string类型的数据

  go func(){ c <- "hello" }() // 发送端
  msg := <-c //  接收端
  fmt.Println(msg)
}

让创建的goroutine发送数据:

go 复制代码
package main

import (
 "fmt"
)

func main() {
 ch := make(chan string)
 
 go sc(ch)
 fmt.Println(<-ch)
}

// sc函数:只能发送数据给 channel,不能接收数据
func sc(ch chan<- string) {
 ch <- "hello"
}

select等待多个channel:select +case ,只有一个会执行

go 复制代码
select {
case <-channel1:
    // 从channel1接收到数据时执行的代码
case data := <-channel2:
    // 从channel2接收到数据时执行的代码
case channel3 <- value:
    // 将value发送到channel3时执行的代码
default:
    // 如果没有通道操作准备就绪,执行的默认操作
}
go 复制代码
package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- "Message from channel 1"
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- "Message from channel 2"
    }()

    select {
    case msg1 := <-ch1:
        fmt.Println(msg1)
    case msg2 := <-ch2:
        fmt.Println(msg2)
    }
}
相关推荐
励志成为嵌入式工程师25 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
码农小旋风1 小时前
详解K8S--声明式API
后端
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~1 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616881 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山2 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js