07-Fortran基础--Fortran指针(Pointer)的使用

news2024/9/21 12:26:42

07-Fortran基础--Fortran指针Pointer的使用

  • 0 引言
  • 1 指针(Poionter)的有关内容
    • 1.1 一般类型指针
    • 1.2 数组指针
    • 1.3 派生类(type)指针
    • 1.4 函数指针
  • 2 可运行code


0 引言

  Fortran是一种广泛使用的编程语言,特别适合科学计算和数值分析。Fortran 90引入了指针的概念,允许程序员动态地管理内存,并在程序中创建灵活的数据结构,前面已经简单介绍过指针类型的定义和赋值,这一部分详细讲下指针的几种用法。

1 指针(Poionter)的有关内容

  在Fortran中,指针是一种特殊的变量类型,用于存储内存地址。指针可以指向任何类型的数据,包括标量、数组、派生类、函数和其他变量。以下是一些Fortran中使用指针的基本概念和用法:

1.1 一般类型指针

  下面运行示例中包含了简单类型指针使用的差不多😀所有情况,可以仔细阅读注释进行理解。

	implicit none
    ! - 1 简单指针定义
    real(8),target :: realNum1 = 5.d0, realNum2 = 100.d0
    real(8),pointer :: ptr 
    real(8),pointer :: ptr2 

	! - 1. 简单的单一变量指针(有以下几种使用情况)
	
    ! a 简单指针赋值
    print *,"a:简单指针,ptr获取了realNum1的地址,此时打印ptr和realNum1是相同值"
    ptr => realNum1
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! b 在a的基础上修改
    print *,""
    print *,"b:修改realNum1的值,ptr也发生改变,因为ptr => realNum1,使ptr和realNum1指向同一处内存空间"
    realNum1 = 55.d0
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! c 在b基础上
    print *,""
    print *,"c:修改ptr的值,realNum1也发生变量,原因是ptr和realNum1地址一样"
    ptr = 60.d0
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! d 在c的基础上
    print *,""
    print *,"d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同,而realNum1保持c的结果"
    ptr => realNum2
    print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    
    ! e:如果d之后把指针ptr置空 [若要运行将e和f屏蔽]
    nullify(ptr)
    print *,""
    print *,"e:使ptr指向为空,发现打印ptr会报错; 仅仅ptr的指向噶了,并不影响它指向的空间"
    if(associated(ptr) == .true.)then
        print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    else
        print *,"ptr=,Null   ","realNum2=",realNum2,"realNum1=",realNum1
    endif
    
    !! f:如果d之后把指针ptr释放了(deallocate)
    !print *,""
    !print *,"f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出,仅仅ptr的指向噶了,并不影响它指向的空间"
    !deallocate(ptr)
    !if(associated(ptr) == .true.)then
    !    print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    !else
    !    print *,"ptr=,Null    ","realNum2=",realNum2,"realNum1=",realNum1
    !endif
      
    ! g:给指针分配内存
    print *,""
    print *,"g:既然可以使用deallocate释放指针,那当然也可以用allocate分配指针内存了"
    allocate(ptr2)
    ptr2 = 200.d0  ! 给指针ptr2赋值
    print *,"ptr2=",ptr2
    
    ! h:在g的基础上
    print *,""
    print *,"h:ptr2是指针,被allocate分配过,那是否还有指向的属性? 指向还是存在的,但这时侯会存在一个问题,	ptr2和realNum1都开辟过空间,而ptr2又指向了realNum1的空间,那就有泄露产生了,因为分配的指针是不会自己释放内存的;"
    ptr2 => realNum1
    print *,"ptr2=",ptr2,"realNum1=",realNum1
    
    ! i: 在h的基础上
    print *,""
    print *,"i:指针ptr和指针ptr2之间的关系是怎样的?让ptr=>ptr2打印结果,发现ptr和ptr2此时指向的为同一空间,值都为realNum1;"
    ptr=>ptr2 
    print *,"ptr=",ptr,"ptr2=",ptr2,"realNum1=",realNum1
	
	end program

运行结果

1.2 数组指针

  同样,用示例说明用法,主要介绍了数组指针基础用法用指针进行数组截断分析对内存的影响

	implicit none
    ! - 2 指针数组定义
    integer,allocatable :: ind(:)
    real(8),target :: arr1(3),arr2(5)
    real(8),pointer :: p1(:) !> 指针数组 
    real(8),pointer :: p2(:) !> 指针数组 
	
	! 先给arr1和arr2赋值
    call RANDOM_SEED()
    call RANDOM_NUMBER(arr1)
    arr2 = 5.d0
    
    ! a:数组指针简单使用
    print *,""
    print *,"a:指针ptr数组简单使用,二者地址一致打印结果相同,同简单类型指针类似,p1和arr1任何一个被该,另一个也随着被改;"
    p1 => arr1
    print *,"arr1",arr1,"p1",p1
    
    ! b:数组指针的特别用法
    print *,""
    print *,"b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组,指针可以多次指向同一目标, 指向的空间/内存必须是连续的;"
    p1 => arr1(2:3)
    print *,"arr1",arr1,"p1",p1
    
    ! c:分配内存
    print *,""
    print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"
    allocate(p1(6))
    p1 = 6
    print *,"arr1",arr1,"p1",p1
    
    ! d:数组指针释放
    print *,""
    print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"
    deallocate(p1)
    if( associated(p1) == .true. )then
        print *,"p1未成功释放"
    else
        print *,"p1已释放"
    endif

	end program

运行结果

1.3 派生类(type)指针

  同样,用示例说明用法,主要介绍了派生类指针的基础用法和赋值

	program test
	implicit none
	! - 3 派生类指针定义
    type :: test_type  !> 定义派生类
        real(8) :: arr(100000)
        real(8) :: arr2(200000)
        real(8),pointer :: ptr3 
    end type
    type(test_type),target :: typeValue
    type(test_type),pointer :: ptype ! 定义派生类指针

	! -3. 派生类中指针使用较为常见,因为派生类中可能会同时存在多个大数组,对内存是致命伤害
    ! - a:派生指针的赋值
    ptype => typeValue            ! 先给指针指向目标,此时二者表示同一内存区域
    call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值
    ptype%ptr3 =>realNum1         ! 给指针的指针赋值
    print *
    print *,"派生类指针初始化"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1),"    派生类指针的指针",ptype%ptr3
    
    ! - b:指针ptype内存释放?
    print *
    deallocate(ptype)
    print *,"释放指针ptype,不影响派生变量typeValue前面的赋值"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",typeValue%arr(1),"    派生类指针的指针",typeValue%ptr3
    
    ! -c:派生类指针内存分配 
    print *
    allocate(ptype)
    call RANDOM_NUMBER(ptype%arr) ! 指针赋值
    ptype%ptr3 =>realNum1
    print *,"指针ptype分配内存,赋初值"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1),"    派生类指针的指针",ptype%ptr3
    
    print *,"对于这样的派生类,使用指针是最高效、最省内存的了"
	
	end program

运行结果

1.4 函数指针

  同样,用示例说明用法,主要介绍了调用函数指针计算将函数指针作为参数在函数之间传递

program test
	implicit none
	! - 4 函数指针    
    procedure(f), pointer :: pf
    real(8) :: fv,x
	
	! -4. 函数指针的使用
    ! a: 函数指针的简单使用
    print *
    print *, "函数指针的简单使用"
    pf => f
    print *, 'pf(2) = ', pf(2.d0) ! 调用f(2.)
    pf => g
    print *, 'pf(2) = ', pf(2.d0) ! 调用g(2.)
    print *
    
    ! b: 函数指针可以作为变量进行传值
    pf => f
    x = 100.d0
    call calfun(pf,x,fv)
    write( *,*),"函数指针作为参数的运算结果",fv
    
contains

  real function f(x)
    real(8), intent(in) :: x
    f = x**2
  end function f

  real function g(x)
    real(8), intent(in) :: x
    g = x**3
  end function g
  
  subroutine calfun(fun,x,fv)
    procedure(f),pointer :: fun
    real(8),intent(in) :: x
    real(8),intent(out) :: fv
    
    fv = fun(x)
  end subroutine
  
end program 

2 可运行code

program test_pointer
	implicit none
	
	! - 1 简单指针定义
    real(8),target :: realNum1 = 5.d0, realNum2 = 100.d0
    real(8),pointer :: ptr 
    real(8),pointer :: ptr2 
    
    ! - 2 指针数组定义
    integer,allocatable :: ind(:)
    real(8),target :: arr1(3),arr2(5)
    real(8),pointer :: p1(:) !> 指针数组 
    real(8),pointer :: p2(:) !> 指针数组 
    
    ! - 3 派生类指针定义
    type :: test_type  !> 定义派生类
        real(8) :: arr(100000)
        real(8) :: arr2(200000)
        real(8),pointer :: ptr3 
    end type
    type(test_type),target :: typeValue
    type(test_type),pointer :: ptype ! 定义派生类指针
    
    ! - 4 函数指针    
    procedure(f), pointer :: pf
    real(8) :: fv,x
    
    ptr2 => null() ! 指针指向空
    
    ! - 1. 简单的单一变量指针(有以下几种使用情况)
    ! a 简单指针赋值
    print *,"a:简单指针,ptr获取了realNum1的地址,此时打印ptr和realNum1是相同值"
    ptr => realNum1
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! b 在a的基础上修改
    print *,""
    print *,"b:修改realNum1的值,ptr也发生改变,因为ptr => realNum1,使ptr和realNum1指向同一处内存空间"
    realNum1 = 55.d0
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! c 在b基础上
    print *,""
    print *,"c:修改ptr的值,realNum1也发生变量,原因是ptr和realNum1地址一样"
    ptr = 60.d0
    print *,"ptr=",ptr,"realNum1=",realNum1
    
    ! d 在c的基础上
    print *,""
    print *,"d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同,而realNum1保持c的结果"
    ptr => realNum2
    print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    
    !! e:如果d之后把指针ptr置空
    !nullify(ptr)
    !print *,""
    !print *,"e:使ptr指向为空,发现打印ptr会报错,仅仅ptr的指向噶了,并不影响它指向的空间"
    !if(associated(ptr) == .true.)then
    !    print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    !else
    !    print *,"ptr=,Null   ","realNum2=",realNum2,"realNum1=",realNum1
    !endif
    !
    !! f:如果d之后把指针ptr释放了(deallocate)
    !print *,""
    !print *,"f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出,仅仅ptr的指向噶了,并不影响它指向的空间"
    !deallocate(ptr)
    !if(associated(ptr) == .true.)then
    !    print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1
    !else
    !    print *,"ptr=,Null    ","realNum2=",realNum2,"realNum1=",realNum1
    !endif
      
    ! g:给指针分配内存
    print *,""
    print *,"g:既然可以使用deallocate释放指针,那当然也可以分配指针"
    allocate(ptr2)
    ptr2 = 200.d0  ! 给指针ptr2赋值
    print *,"ptr2=",ptr2
    
    ! h:在g的基础上
    print *,""
    print *,"h:ptr2是指针,被allocate分配过,那是否还有指向的属性? 指向还是存在的,但这时侯会存在一个问题,&
        ptr2和realNum1都开辟过空间,而ptr2又指向了realNum1的空间,那就有泄露产生了,因为分配的指针是不会自己释放内存的;"
    ptr2 => realNum1
    print *,"ptr2=",ptr2,"realNum1=",realNum1
    
    ! i: 在h的基础上
    print *,""
    print *,"i:指针ptr和指针ptr2之间的关系是怎样的?让ptr=>ptr2打印结果,发现ptr和ptr2此时指向的为同一空间,值都为realNum1;"
    ptr=>ptr2 
    print *,"ptr=",ptr,"ptr2=",ptr2,"realNum1=",realNum1
    
    ! -2. 指针数组的使用
    
    ! 先给arr1和arr2赋值
    call RANDOM_SEED()
    call RANDOM_NUMBER(arr1)
    arr2 = 5.d0
    
    ! a:数组指针简单使用
    print *,""
    print *,"a:指针ptr数组简单使用,二者地址一致打印结果相同,同简单类型指针类似,p1和arr1任何一个被该,另一个也随着被改;"
    p1 => arr1
    print *,"arr1",arr1,"p1",p1
    
    ! b:数组指针的特别用法
    print *,""
    print *,"b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组,指针可以多次指向同一目标, 指向的空间/内存必须是连续的;"
    p1 => arr1(2:3)
    print *,"arr1",arr1,"p1",p1
    
    ! c:分配内存
    print *,""
    print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"
    allocate(p1(6))
    p1 = 6
    print *,"arr1",arr1,"p1",p1
    
    ! d:数组指针释放
    print *,""
    print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"
    deallocate(p1)
    if( associated(p1) == .true. )then
        print *,"p1未成功释放"
    else
        print *,"p1已释放"
    endif
    
    ! -3. 派生类中指针使用较为常见,因为派生类中可能会同时存在多个大数组,对内存是致命伤害
    ! - a:派生指针的赋值
    ptype => typeValue            ! 先给指针指向目标,此时二者表示同一内存区域
    call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值
    ptype%ptr3 =>realNum1         ! 给指针的指针赋值
    print *
    print *,"派生类指针初始化"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1),"    派生类指针的指针",ptype%ptr3
    
    ! - b:指针ptype内存释放?
    print *
    deallocate(ptype)
    print *,"释放指针ptype,不影响派生变量typeValue前面的赋值"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",typeValue%arr(1),"    派生类指针的指针",typeValue%ptr3
    
    ! -c:派生类指针内存分配 
    print *
    allocate(ptype)
    call RANDOM_NUMBER(ptype%arr) ! 指针赋值
    ptype%ptr3 =>realNum1
    print *,"指针ptype分配内存,赋初值"
    write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1),"    派生类指针的指针",ptype%ptr3
    
    print *,"对于这样的派生类,使用指针是最高效、最省内存的了"
    
    ! -4. 函数指针的使用
    ! a: 函数指针的简单使用
    print *
    print *, "函数指针的简单使用"
    pf => f
    print *, 'pf(2) = ', pf(2.d0) ! 调用f(2.)
    pf => g
    print *, 'pf(2) = ', pf(2.d0) ! 调用g(2.)
    print *
    
    ! b: 函数指针可以作为变量进行传值
    pf => f
    x = 100.d0
    call calfun(pf,x,fv)
    write( *,*),"函数指针作为参数的运算结果",fv
    
contains

  real function f(x)
    real(8), intent(in) :: x
    f = x**2
  end function f

  real function g(x)
    real(8), intent(in) :: x
    g = x**3
  end function g
  
  subroutine calfun(fun,x,fv)
    procedure(f),pointer :: fun
    real(8),intent(in) :: x
    real(8),intent(out) :: fv
    
    fv = fun(x)
  end subroutine
  
end program 

  程序中若有不理解的地方可以留言讨论,希望对需要的人有些许帮助。

🕝
🕝🕝
🕝🕝🕝
🕝🕝🕝🕝
🕝🕝🕝🕝🕝
🕝🕝🕝🕝🕝🕝
🕝🕝🕝🕝🕝🕝🕝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

指针在函数的应用(C++)

一、传递地址 实参传递进函数体内后,生成的是实参的副本,在函数内改变副本的值并不影响实参。指针传递参数时,指针变量产生了副本,但副本与原变量指向的内存区域是同一个。改变指针副本指向的变量,就是改变原指针变量指…

Java 插入数据到Elasticsearch中进行各种类型文档的内容检索

源码下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D3yszkTzjwQz0vFRozQl2g?pwdz6kb 提取码&#xff1a;z6kb 实现思路 1.搭建一个新的springboot项目&#xff0c;不会的请看我这篇博客&#xff1a;springboot项目搭建 2.添加maven依赖 <dependency><…

项目管理-案例重点知识(成本管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 三、成本管理 案例重点 成本管理 案例重点内容&#xff1a; &#xff08;1&#xff09;成本管理计划内容 &#xff08;2&#xff09;估算…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先&#xff0c;根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0&#xff0c;是的话则要扩容&#xff0c;resize&#xff08;&#xff09;。接着&#xff0c;根据哈希值计算数组下标。如果这个下标位置为空&a…

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

踩坑小结:Linux安装python环境 、安装OpenSSL

一、查看python版本 查看发现&#xff0c;linux上自带了python&#xff0c;不过是2.x版本的。 二、下载python3 2.1 下载 www.python.org/downloads/s… 可在当前目录下找到相对应的版本或者最新版本下载 也可以直接下载 Python 3.10.4 下载完在服务器上选择一个目录存放…

ffmpeg使用xfade的转场特效

ffmpeg使用xfade的转场特效 1. 介绍2. ffmpeg里面的xfade3. 使用 1. 介绍 参考文档 ffmpeg是一个音视频编辑工具&#xff0c;具体的。。。。我才搞接触&#xff0c;所以不懂。 xfade是一种视频转场滤镜&#xff0c;用于在两个视频片段之间创建平滑的过渡效果。xfade的转场效果…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)

戒烟网站 目录 基于SSM&#xff0b;vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…

OPC-UA open62541 C++测试代码

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 这是之前写的open62541测试代码…

电脑版的学浪课程下载方法

想在你的电脑上无限制地访问你最爱的学浪课程吗&#xff1f;现在&#xff0c;让我揭秘如何用几个简单步骤&#xff0c;轻松下载任何学浪课程到你的电脑&#xff0c;让学习不再受时间和地点的限制&#xff0c;随时随地都是你的课堂。 下载学浪视频的工具&#xff0c;我已经打包…

计算机网络实验3:路由器安全防控配置

实验目的和要求 理解标准IP访问控制列表的原理及功能理解CHAP、DHCP配置原理了解家用式无线路由配置方法实验项目内容 标准IP访问控制列表配置 CHAP验证路由器上配置DHCP网络地址转换NAT配置无线路由实现实验环境 1. 硬件&#xff1a;PC机&#xff1b; 2. 软件&#xff1a;W…

SQL复习

SQL基础 包括&#xff1a; 数据查询&#xff1a;SELECT数据定义语言&#xff1a;CREATE、ALTER和DROP数据操纵语言&#xff1a;INSERT、UPDATE、DELETE数据控制语言&#xff1a;GRANT、REVOKE 特点&#xff1a; 综合统一高度非过程化面向集合既是独立的也是嵌入式语言 三…

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

【Arduino】Free RTOS系统

目录 1、任务创建 2、任务删除 3、延迟函数 4、示例&#xff1a; ESP32的SDK包中内置了FreeRTOS&#xff0c;在FreeRTOS中&#xff0c;线程&#xff08;Thread&#xff09;和任务&#xff08;Task&#xff09;的概念是相同的。每个任务就是一个线程&#xff0c;有着自己的一…

Go框架三件套:Gorm的基本操作

1.概述 这里的Go框架三件套是指 Web、RPC、ORM框架&#xff0c;具体如下: Gorm框架 gorm框架是一个已经迭代了10年的功能强大的ORM框架&#xff0c;在字节内部被广泛使用并且拥有非常丰富的开源扩展。 Kitex框架 Kitex是字节内部的Golang微服务RPC框架&#xff0c;具有高性能…

IDEA不能创建新项目和新模块

问题&#xff1a; IDEA不管是创建新项目还是新模块都创建不成功&#xff0c;会报如下图错误 解决方案&#xff1a; 在电脑设置里搜索 “防火墙和网络保护” &#xff0c;打开如下图所示 找到你所安装的IDEA&#xff0c;更改设置&#xff0c;选中IDEA 最后&#xff0c;确定&am…