Go学习(七):方法、面向对象

Golang 面向对象全解 Golang 面向对象全解     golang的面向对象是不完备的面向对象,大部分人员都是从java转换而来,造成了很多的坑,这一篇文章记录我已知的golang面向对象性质和坑,希望后来者注意。 基础          首先面向对象具有三大特性,封装、继承、多态,golang均不直接支持这三种特性,但都可以通过别的方式来实现这三种特性。 封装 golang中没有class只有struc 阅读详情

目录

1、方法

1.1 匿名字段

1.2 方法集

1.3 表达式

1.4 自定义error

1.4.1 抛异常和处理异常

(1) 系统抛

(2) 返回异常

(3) 自定义error

2、面向对象

2.1 匿名字段(同上)

2.2 接口


1、方法

1.1 匿名字段

通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现 "override"。

//也是面向对象的内容
go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段
所有的内置类型和自定义类型都是可以作为匿名字段去使用
package main

import "fmt"

type User struct {
    id   int
    name string
}

type Manager struct {
    User  //匿名字段
    title string
}

func (self *User) ToString() string {
    return fmt.Sprintf("User: %p, %v", self, self)
}

func (self *Manager) ToString() string {
    return fmt.Sprintf("Manager: %p, %v", self, self)
}

func main() {
    m := Manager{User{1, "Tom"}, "Administrator"}

    fmt.Println(m.ToString())

    fmt.Println(m.User.ToString())
}
//输出
//Manager: 0xc420074180, &{{1 Tom} Administrator}
//User: 0xc420074180, &{1 Tom}

1.2 方法集

    • 类型 T 方法集包含全部 receiver T 方法。
    • 类型 *T 方法集包含全部 receiver T + *T 方法。
    • 如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。 
    • 如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。 
    • 不管嵌入 T 或 *T,*S 方法集总是包含 T + *T 方法。
package main

import (
    "fmt"
)

type S struct {
    T
}

type T struct {
    int
}

func (t T) testT() {
    fmt.Println("如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法")
}
func (t *T) testP() {
    fmt.Println("如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法")
}

func main() {
    s1 := S{T{1}}
    s2 := &s1
    fmt.Printf("s1 is : %v\n", s1)
    s1.testT()
    s1.testP()
    fmt.Printf("s2 is : %v\n", s2)
    s2.testT()
    s2.testP()
}
    s1 is : {{1}}
    如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法
    如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法
    s2 is : &{{1}}
    如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法
    如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法

1.3 表达式

两者都可像普通函数那样赋值和传参,区别在于 method value 绑定实例,而 method expression 则须显式传参。

package main

import "fmt"

type User struct {
    id   int
    name string
}

func (self *User) Test() {
    fmt.Printf("%p, %v\n", self, self)
}

func main() {
    u := User{1, "Tom"}
    u.Test()

    mValue := u.Test  //绑定实例
    mValue() // 隐式传递 receiver

    mExpression := (*User).Test
    mExpression(&u) // 显式传递 receiver
}

//0xc42000a060, &{1 Tom}
//0xc42000a060, &{1 Tom}
//0xc42000a060, &{1 Tom}

method value 会复制 receiver 

package main

import "fmt"

type User struct {
	id   int
	name string
}

func (self User) Test() {
	fmt.Println(self)
}

func main() {
	u := User{1, "Tom"}
	mValue := u.Test // 立即复制 receiver,因为不是指针类型,不受后续修改影响。

	u.id, u.name = 2, "Jack"
	u.Test()	//修改了u,输出 {2 Jack}

	mValue()	//但mvalue不受影响,输出{1 Tom}
}
package main

import "fmt"

type User struct {
    id   int
    name string
}

func (self *User) TestPointer() {
    fmt.Printf("TestPointer: %p, %v\n", self, self)
}

func (self User) TestValue() {
    fmt.Printf("TestValue: %p, %v\n", &self, self)
}

func main() {
    u := User{1, "Tom"}
    fmt.Printf("User: %p, %v\n", &u, u)

    mv := User.TestValue
    mv(u)

    mp := (*User).TestPointer
    mp(&u)

    mp2 := (*User).TestValue // *User 方法集包含 TestValue。签名变为 func TestValue(self *User)。实际依然是 receiver value copy。
    mp2(&u)
}
    User: 0xc42000a060, {1 Tom}
    TestValue: 0xc42000a0a0, {1 Tom}
    TestPointer: 0xc42000a060, &{1 Tom}
    TestValue: 0xc42000a100, {1 Tom}

1.4 自定义error

1.4.1 抛异常和处理异常

(1) 系统抛
package main

import "fmt"

// 系统抛
func test01() {
   a := [5]int{0, 1, 2, 3, 4}
   a[1] = 123
   fmt.Println(a)
   //a[10] = 11
   index := 10
   a[index] = 10
   fmt.Println(a)
}

func getCircleArea(radius float32) (area float32) {
   if radius < 0 {
      // 自己抛
      panic("半径不能为负")
   }
   return 3.14 * radius * radius
}

func test02() {
   getCircleArea(-5)
}

//
func test03() {
   // 延时执行匿名函数
   // 延时到何时?(1)程序正常结束   (2)发生异常时  //发生异常时
   defer func() {
      // recover() 复活 恢复
      // 会返回程序为什么挂了
      if err := recover(); err != nil {
         fmt.Println(err)
      }
   }()
   getCircleArea(-5)
   fmt.Println("这里有没有执行")   //没执行
}

func test04()  {
   test03()
   fmt.Println("test04")
}

func main() {
   test04()
}
半径不能为负
test04
(2) 返回异常
package main

import (
   "errors"
   "fmt"
)

func getCircleArea(radius float32) (area float32, err error) {
   if radius < 0 {
      // 构建个异常对象
      err = errors.New("半径不能为负")
      return
   }
   area = 3.14 * radius * radius
   return
}

func main() {
   area, err := getCircleArea(-5)
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println(area)
   }
}
(3) 自定义error
package main

import (
    "fmt"
    "os"
    "time"
)

type PathError struct {
    path       string
    op         string
    createTime string
    message    string
}

func (p *PathError) Error() string {
    return fmt.Sprintf("path=%s \nop=%s \ncreateTime=%s \nmessage=%s", p.path,
        p.op, p.createTime, p.message)
}

func Open(filename string) error {

    file, err := os.Open(filename)
    if err != nil {
        return &PathError{
            path:       filename,
            op:         "read",
            message:    err.Error(),
            createTime: fmt.Sprintf("%v", time.Now()),
        }
    }

    defer file.Close()
    return nil
}

func main() {
    err := Open("/Users/5lmh/Desktop/go/src/test.txt")
    switch v := err.(type) {
    case *PathError:
        fmt.Println("get path error,", v)
    default:

    }

}

2、面向对象

2.1 匿名字段(同上)

2.2 接口

 请牢记接口(interface)是一种类型。定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。不关心属性(数据),只关心行为(方法)。

Go语言提倡面向接口编程。

    接口是一个或多个方法签名的集合。
    任何类型的方法集中只要拥有该接口'对应的全部方法'签名。
    就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。
    这称为Structural Typing。
    所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。
    当然,该类型还可以有其他方法。

    接口只有方法声明,没有实现,没有数据字段。
    接口可以匿名嵌入其他接口,或嵌入到结构中。
    对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。
    只有当接口存储的类型和对象都为nil时,接口才等于nil。
    接口调用不会做receiver的自动转换。
    接口同样支持匿名字段方法。
    接口也可实现类似OOP中的多态。
    空接口可以作为任何类型数据的容器。
    一个类型可实现多个接口。
    接口命名习惯以 er 结尾。
 type 接口类型名 interface{
        方法名1( 参数列表1 ) 返回值列表1
        方法名2( 参数列表2 ) 返回值列表2
        …
}

1.接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。
2.方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
3.参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。

例子:
type writer interface{
    Write([]byte) error
}

接口类型变量能够存储所有实现了该接口的实例。 例如上面的示例中,Sayer类型的变量能够存储dog和cat类型的变量。

package main

import (
	"fmt"
)

// Sayer 接口
type Sayer interface {
	say()
}
type dog struct{}

type cat struct{}

// dog实现了Sayer接口
func (d dog) say() {
	fmt.Println("汪汪汪")
}

// cat实现了Sayer接口
func (c cat) say() {
	fmt.Println("喵喵喵")
}
func main() {
	var x Sayer // 声明一个Sayer类型的变量x
	a := cat{}  // 实例化一个cat
	b := dog{}  // 实例化一个dog
	x = a       // 可以把cat实例直接赋值给x
	x.say()     // 喵喵喵
	x = b       // 可以把dog实例直接赋值给x
	x.say()     // 汪汪汪
}
// 喵喵喵
// 汪汪汪
 值接收者和指针接收者实现接口

值接收者可以接受值和指针,因为Go语言中有对指针类型变量求值的语法糖,dog指针fugui内部会自动求值*fugui

指针接收者只能接受指针

类型与接口的关系:

一个类型实现多个接口:dog可以实现say和move

多个类型实现同一接口:dog和cat都可以move,(像多态)

并且一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构体来实现。

package main

import (
	"fmt"
)

// WashingMachine 洗衣机
type WashingMachine interface {
	wash()
	dry()
}

// 甩干器
type dryer struct{}

// 实现WashingMachine接口的dry()方法
func (d dryer) dry() {
	fmt.Println("甩一甩")
}

// 海尔洗衣机
type haier struct {
	dryer //嵌入甩干器
}

// 实现WashingMachine接口的wash()方法
func (h haier) wash() {
	fmt.Println("洗刷刷")
}

func main() {
	var h haier
	var w WashingMachine
	w = h
	w.wash()
	w.dry()
}
接口嵌套
//接口与接口间可以通过嵌套创造出新的接口

// Sayer 接口
type Sayer interface {
    say()
}

// Mover 接口
type Mover interface {
    move()
}

// 接口嵌套
type animal interface {
    Sayer
    Mover
}
空接口:

 空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。

package main

import (
	"fmt"
)

func main() {
	// 定义一个空接口x
	var x interface{}
	s := "pprof.cn"
	x = s
	fmt.Printf("type:%T value:%v\n", x, x)
	i := 100
	x = i
	fmt.Printf("type:%T value:%v\n", x, x)
	b := true
	x = b
	fmt.Printf("type:%T value:%v\n", x, x)
}


//type:string value:pprof.cn
//type:int value:100
//type:bool value:true

空接口的应用:做函数参数,作为map的值

// 空接口作为函数参数
func show(a interface{}) {
    fmt.Printf("type:%T value:%v\n", a, a)
}


// 空接口作为map值
    var studentInfo = make(map[string]interface{})
    studentInfo["name"] = "李白"
    studentInfo["age"] = 18
    studentInfo["married"] = false
    fmt.Println(studentInfo)

/map[age:18 married:false name:李白]

类型断言

func main() {
    var x interface{}
    x = "pprof.cn"
    v, ok := x.(string)
    if ok {
        fmt.Println(v)
    } else {
        fmt.Println("类型断言失败")
    }
}
Blender学习笔记——制作向量场 #下载Blender - UE4 - FGA Vector Field Editor插件的压缩包,Github上的下载地址如下:https://github.com/isathar/Blender_UE4_VectorFieldEditor #下载并解压后将FGA VectorFields文件夹复制到C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\addons目录下,此步骤可根据blender安装的位置自行调整,只要放入addon 阅读详情

相关推荐

省一蓝桥杯嵌入式-09RTC实时时钟

RTC(Real-Time Clock)实时时钟,是一个独立的定时器RTC模块拥有一组连续的计数的计数器,在响应软件配置下,可提供时钟、日历、闹钟功能RTC能提供年月日时分秒等信息(可设置)在系统复位或从待机模式唤醒后,RTC的设置时间维持不变(这个我没实现,复位后时间也重置了,有能力的可以自己研究一下)持续时间跟踪:在主系统断电后或处于低功耗模式时,RTC仍继续工作,原理是有额外的电池为其供电(蓝桥杯板子没有这个备用电源,该功能无效。

qq_46392331的博客 1728

GO 面向对象

文章目录前言一、结构体定义结构体的格式定义结构体的实例、对象、变量,属于复合类型定义结构体时为成员赋值(按顺序写)定义结构体时为成员赋值(不按顺序写)用自动类型推导结构体的赋值结构体的比较二、结构体数组和切片三、结构体之间的转换三、接口 前言 Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。 Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地

weixin_59633478的博客 865

WRF所需气象数据的下载方法

#数据下载是个大问题,巧妇难为无米之炊,没有数据就无法模拟啦,疫情期间国外服务器响应慢,打开网页慢都很正常啦~ WRF数据所需要的外部数据分为两种:静态地理数据,grib格式的气象数据(NAM、GFS、RUC、AGRMET等)。静态地理数据可以从WRF官网获得,比较简单,这里不做介绍。所以这篇日志重点介绍的是气象数据的获取。 提前说明,WRF官网不提供气象数据,但WRF官网提供各类气象数据的下载网址链接,所以我们下载一般还是从WRF官网开始。首先进入WRF官网,然后点击WRF ARW Uusres’ .

六出的博客 1万+

010.Go语言中的面向对象

Go语言中的面向对象

ZGSDMAN的博客 968

大模型运维实战:从GPU选型到推理服务稳定落地

大模型服务进入生产环境后,运维对象从传统进程转向GPU显存、KV Cache、推理吞吐等动态资源。显存利用率、首token延迟、并发队列深度等指标,直接影响模型服务的质量与成本。理解推理框架的内存分配机制、掌握监控告警与自动化扩容手段,是保障服务稳定的关键。这类能力广泛应用于企业私有化部署、智能客服、知识库问答等场景,帮助运维团队从被动救火转向主动容量规划与性能调优。本文围绕大模型运维的完整路线,梳理从硬件选型、推理部署到监控排障的实战经验,并算清一份真实项目的长期成本账。

weixin_29054245的博客 238

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 486

Go:Go语言中的“面向对象”

Go语言中,实际上并没有“对象”、“类”、“继承”等概念,但是在实际的项目开发中,为了提高代码的可维护性、可扩展性和可复用性,我们不得不使用面向对象的设计理念来编码。因此,我们需要使用Go中的组合、接口等机制实现类似的面向对象特性,如继承、封装和多态。

Liu_y_xin的博客 1205

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

Go中的面向对象

面向对象是重要的一部分,在日后的学习之中,肯定是有重要帮助的,所以我们需要进行学习,并且是重点学习,这可以让我们的基础更加牢靠,所以,当一段时间之后,就要复习,与便于让啊我们对这个理解加深,使得我们学习有更好的成效。

z3551906947的博客 515

Coze智能体开发:如何搭建一个生成长文本的工作流

扣子工作流提供了流程定制化的能力,我们可以把长文生成的流程拆分为多个步骤,例如先通过大模型节点生成大纲、再使用循环节点依次扩写各个段落,最后将各个段落组合起来,从而实现长文生成流程。此工作流可适用于学术写作、商业报告、小说创作等多种场景。

王国平的博客 1789

DO-297标准详解:IMA系统开发与认证指南

DO-297的前言部分为读者提供了本指南的概述,说明了该标准的编写背景、主要目标、目标受众以及该文件在开发和认证集成模块化航空电子(IMA,Integrated Modular Avionics)系统中的作用。作为现代航空电子架构的重要组成部分,IMA系统大幅度简化了航空电子系统的硬件配置,增加了灵活性并降低了成本。因此,DO-297成为确保IMA系统开发、集成和认证符合适航标准的核心文件。在现代航空领域,系统复杂性逐渐增加,传统上各子系统独立运行的方式已经不适应多任务、多功能的需求。

qq_41854911的博客 1583

go 面向对象

概述 go的面向对象和其它的面向语言并不太相同。首先,go是没有类的概念的,在go中数据是数据,方法是方法,二者比较独立。其次go对继承的实现更像是“组合”。go的接口是鸭子类型:只要你像个鸭子,那么我就认为你是个鸭子,而不需要显式的实现接口,像java的implements XXX在go是不存在的。 面向对象的三个特征:继承、封装、多态 go都可以实现。(多态需要基于接口实现) 基础语法 type User struct { name string } func (u User) introduceM

衡与墨的博客 2929

「PAT乙级真题解析」Basic Level 1034 有理数四则运算 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定两个有理数, 要求输出这两个有理数的和、差、积、商。 如果只是这样, 则问题很简单, 但是题设要求输出的每个有理数必须是最简形式. **所以本题的一个重点是如何将有理数转为题设要求的有理数.**

过美好生活,做高效程序员 3129

【Golang 快速入门】基础语法 + 面向对象

Golang 语言特性 Golang 的优势 Golang 的应用场景 Golang 的不足 基础语法 main 变量 常量与 iota string 字符串遍历 strings 包 bytes 包 strconv 包 unicode 包 循环语句 range 函数 多返回值 init 函数 闭包 import 导包 匿名函数 指针 defer 切片 slice 数组 slice slice 操作 ... map map 的声明 map 的使用 error 面向对象编程 type 方法 struct 封装

萌宅鹿的技术小屋 9259

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Go-Golang学习总结笔记

资源 某hub会审核不通过,自己去找吧 书籍 网站 基础 go官方中文网 菜鸟教程 C语言网 go语言中文网 golang系列 视频 基础 安装 依赖管理 数据类型 变量和常量 流程控制 函数 包 面向对象编程 提高 ...

关注网络安全、云原生安全 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

从Java到Go:Java工程师的Golang学习指南

作为一名Java工程师,你可能已经习惯了Java的面向对象编程、强大的生态系统以及丰富的工具链。然而,随着Go语言(Golang)在云计算、微服务和并发编程领域的崛起,学习Go语言成为了一个非常有价值的选择。本文将通过对比Java和Go语言的方式,帮助你快速掌握Go语言的核心概念,并通过详细的案例讲解,帮助你理解两者之间的异同。 Go 对比: Go 对比: Go 对比: Go 对比:Java通过类和接口实现多线程编程,或者使用包中的高级并发工具。 Go Go语言通过实现并发,是轻量级的线程,由Go运

SunnyRivers 1750

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

详解 Go之面向对象

面向对象的三大特点是:封装、继承、多态,那么Go是面向对象的语言吗?

MClink的博客 5082

【Go语言快速上手(四)】面向对象的三大特性引入

本篇文章讲解了GO语言面向对象的大三特性,封装,继承和多态.还讲解GO语言中的接口的概念以及如何使用接口实现多态

杭电码农-NEO的博客 2692

micro-radar 桌面雷达渲染原理:LovyanGFX 双缓冲、雷达扫描动画与航向三角形绘制完全指南

micro-radar 是一款把真实航班数据搬上办公桌面玩具级屏幕的微型飞行雷达(flight radar)。本文带你拆解它的渲染原理:LovyanGFX 双缓冲、雷达扫描动画与航向三角形绘制是如何在一块 240×240 的圆形小屏上,画出流畅不闪烁的实时雷达画面的 📡 ## 硬件与渲染基础:一块圆形小屏如何"画"出雷达 micro-radar 的核心是一块 ESP32-C3 + 1.28

gitblog_00048的博客 1036

golang学习六:面向对象:继承,对象方法,接口

文章目录一、概述:1. 什么是面向对象:2. Go语言中的面向对象:3. 继承:3.1 匿名字段: 一、概述: 1. 什么是面向对象: 属性就是特征; 方法就是行为; 2. Go语言中的面向对象: 严格意义上讲, Go语言中没有类(class)的概念, 但是可以将结构体比作类, 因为在结构体中可以添加属性(成员)和方法(函数); 继承: 通过匿名字段实现; 多态: 通过接口实现; 封装: 通过方法实现; 3. 继承: 3.1 匿名字段: ...

浅弋、璃鱼的博客 1016

golang学习【9】:面向对象进阶

面向对象进阶

loo_Charles_ool的博客 1235

编程笔记 GOLANG基础 001 为什么要学习Go语言

Go语言是由Google开发的一种静态类型、编译型、并发安全的编程语言。是本人推荐的首学编程语言。

明月看潮生的博客 1621

01 go语言(golang) - 入门

Go(又称为Golang)是由Google开发的一种静态类型、编译型、并发导向的编程语言。它由Robert Griesemer、Rob Pike和Ken Thompson在2007年设计,并于2009年正式对外发布。官网介绍:https://go.dev/doc/effective_go从官网的指南可以了解接下来的大概学习路线,以下是通过kimi总结翻译的几个点:介绍:示例:格式化:命名:控制结构:函数:数据:并发:错误处理:Web服务器示例:每种语言都有核心特征及其设计目标,Java 和 Scala 运行

瑞瑞的博客 1270

go的面向对象学习

在某些情况下,我们需要声明(定义)方法,比如Person结构体,除了有一些字段外(年龄,姓名…)Person结构体还有一些行为比如:可以说话、跑步。。通过学习,还可以做算术题,这时要使用方法才可以完成Golang中的方法是作用在指定的数据类型上的(即。和指定的数据类型绑定)因此自定义类型都可以有方法,而不仅仅是structtest方法和Person类型绑定test方法只能通过Person类型的变量来调用,而不能直接调用,也不能使用其他类型变量来调用下面的使用方式都是错误的dog.test()

weixin_55418082的博客 583

golang学习【8】:面向对象与面向过程

golang面向对象介绍

loo_Charles_ool的博客 1041

Golang学习总结

一、基本语法 Golang 设计理念:一种事情有且只有一种方法完成 软件包安装 直接官网下载好,配置安装下环境变量即可 /etc/profile # 在这个文件写入会对所有用户生效 ~/.profile # 在这个文件写入只会对当前用户生效 # 以上两个文件中任意选择一个 # 将 Go 的安装目录记录下,比如安装目录为 /home/CHAO/Document/go/bin export GOROOT=/usr/local/go #这个表示go

weixin_45541397的博客 2270
上一篇: Go学习(六):函数
下一篇: wsl2配置cuda和编译tensorflow
Lay_XZ
博客等级 码龄5年 29粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值