Go語言初識--標識符 可見性

Go語言初識–標識符 可見性

和C語言相似,go語言的基本組成有:

  1. 包聲明,編寫源文件時,必須在非注釋的第一行指明這個文件屬于哪個包,如package main。
  2. 引入包,其實就是告訴Go 編譯器這個程序需要使用的包,如import "fmt"其實就是引入了fmt包。
  3. 函數,和c語言相同,即是一個可以實現某一個功能的函數體,每一個可執行程序中必須擁有一個main函數。
  4. 變量,Go 語言變量名由字母、數字、下劃線組成,其中首個字符不能為數字。
  5. 語句/表達式,在 Go 程序中,一行代表一個語句結束。每個語句不需要像 C 家族中的其它語言一樣以分號 ; 結尾,因為這些工作都將由 Go 編譯器自動完成。
  6. 注釋,和c語言中的注釋方式相同,可以在任何地方使用以 // 開頭的單行注釋。以 /* 開頭,并以 */ 結尾來進行多行注釋,且不可以嵌套使用,多行注釋一般用于包的文檔描述或注釋成塊的代碼片段。

標識符

標識符(Identifier)是程序中用來命名實體(如變量、函數、類型、常量、結構體字段等)的名字。在 Go 語言中,標識符的命名遵循以下規則:

  1. 組成部分

    • 標識符由字母、數字和下劃線 _ 組成。
    • 標識符的第一個字符必須是字母(a-zA-Z)或下劃線 _,不能是數字。

    例如:

    var valid1 int    // 合法
    var 1invalid int  // 不合法,不能以數字開頭
    var _validName int // 合法
    
  2. 大小寫

    • 大寫字母開頭的標識符被認為是 導出 的(即在其他包中可見)。
    • 小寫字母開頭的標識符是 未導出 的,只能在當前包內訪問。

Go 語言中的可見性規則(導出與未導出):

1. 導出標識符(Exported Identifier)

  • 大寫字母開頭的標識符可以被外部包訪問,也就是說,這種標識符對外部包是 可見的
  • 這與其他語言中的 public 類似,例如 Java 或 C++ 中的公共成員。

示例

// 定義一個結構體和函數,結構體字段和函數名首字母大寫,表示它們是導出的
package mypackage// 導出字段
type MyStruct struct {Name string
}// 導出函數
func MyFunction() {fmt.Println("This is a public function!")
}

在這個示例中,MyStruct 結構體和其字段 Name,以及 MyFunction 函數都可以被外部包使用:

package mainimport "mypackage"func main() {var s mypackage.MyStructs.Name = "Hello"  // 可以訪問 Name 字段,因為它是導出的mypackage.MyFunction()  // 可以調用 MyFunction,因為它是導出的
}
  • MyStructMyFunction導出 的,因為它們的名字以大寫字母開頭,其他包可以直接訪問它們。

2. 未導出標識符(Unexported Identifier)

  • 小寫字母開頭的標識符未導出 的,只能在定義它的包內訪問,外部包無法直接訪問。
  • 這類似于其他語言中的 privateprotected 成員。

示例

package mypackage// 未導出字段
type MyStruct struct {name string // 小寫字母開頭,表示未導出
}// 未導出函數
func myFunction() {fmt.Println("This is a private function!")
}

在這個示例中,MyStructname 字段和 myFunction 函數都是 未導出 的,它們只能在 mypackage 包內部使用,其他包無法訪問:

package mainimport "mypackage"func main() {var s mypackage.MyStructs.name = "Hello"  // 錯誤:無法訪問未導出的字段 'name'mypackage.myFunction()  // 錯誤:無法調用未導出的函數 'myFunction'
}
  • 由于 name 字段和 myFunction 函數都是小寫字母開頭,表示它們是 未導出 的,外部包無法訪問。

總結:

  1. 標識符組成:Go 中的標識符由字母、數字和下劃線組成,但首字符必須是字母或下劃線。

  2. 導出和未導出

    • 大寫字母開頭的標識符(如 MyStructMyFunction)是 導出的,可以被外部包訪問。

    • 小寫字母開頭的標識符(如 namemyFunction)是 未導出的,只能在當前包內訪問。

    • 導出:類似于其他語言中的 public,表示對外部可見。

    • 未導出:類似于其他語言中的 private,表示對外部不可見。

為什么這個規則很重要?

  1. 封裝性:Go 使用這種規則來實現封裝,只暴露給外部包必要的功能,而隱藏包內部的實現細節。
  2. API 設計:通過將某些函數和類型字段標記為 導出未導出,你可以更清晰地設計包的公共接口,并防止外部包訪問不該訪問的內部實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89926.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實例之畫小豬佩奇

效果圖:python代碼以及解釋,沒有運用模塊。 """ 繪制小豬佩奇 """ from turtle import *def nose(x,y):"""畫鼻子"""penup()# 將海龜移動到指定的坐標goto(x,y)pendown()# 設置海龜的方向&…

Unity筆記——事件中心

事件中心是什么事件中心是 Unity 游戲開發中常用的架構設計,它基于觀察者模式 或 發布-訂閱模式,通過委托和事件構建的一種消息管理系統。主要用于降低代碼耦合度,實現模塊間的松耦合通信的消息處理系統能大幅提升代碼的可維護性和擴展性&…

Java: 反射機制的 ParameterizedType(參數化類型)

在 Java 中,ParameterizedType 是 java.lang.reflect 包下的一個接口,屬于反射 API 的一部分,主要用于表示參數化類型(即帶有類型參數的泛型類型)。它是 Java 反射機制中處理泛型類型信息的關鍵接口之一。 一、什么是參…

OkHttp 與 Retrofit 完美結合:打造高效的 Android 網絡請求

前言在現代 Android 開發中,網絡請求是幾乎每個應用都必不可少的功能。OkHttp 和 Retrofit 作為當前最流行的網絡請求庫組合,為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何將這兩者結合使用,充分發揮它們的優勢。一、OkHttp 和 Retr…

系統辨識建模

系統辨識建模 一、系統辨識建模的作用 1. 建立真實物理系統的數學模型 2. 為后續控制器/強化學習算法提供仿真環境 3. 提高控制精度和安全性 二、本文的系統辨識是怎么做的 1. 實驗采集 2. 數學建模 3. 在控制系統中的作用 三、實際用法流程(簡化版) 1. 系統辨識階段 2. 強化…

Android開發:Java與Kotlin深度對比

1. 語言特性與現代性 Java (特別是 Android 主要使用的 Java 8 及之前版本): 相對冗長: 需要編寫更多的樣板代碼(如 getter/setter、findViewById 的顯式類型轉換、匿名內部類等)。空指針異常 (NPE): 類型系統默認允許 null&#…

米家打印機驅動:Wi-Fi 無線打印絲滑順暢不卡頓,從此告別對打印機干瞪眼

各位小米家居控們,你們有沒有過這種經歷,新買的打印機回家,結果電腦跟它像倆傲嬌的小情侶,死活不搭話?急得你想當場表演一個“打印機抱頭痛哭”?別急,今天就給你們安利個神隊友——米家打印機驅…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(7):自動詞 & 他動詞

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(7):自動詞 & 他動詞1、前言(1)情況說明(2)工程師的信仰2、知識點(1)自動詞 & 他動…

深入理解設計模式:訪問者模式詳解

在軟件開發中,我們經常會遇到需要對一個復雜對象結構進行操作的情況。隨著需求的不斷變化,我們可能需要在這個對象結構上添加各種新的操作。如果直接在對象結構中添加這些操作,會導致類的職責過重,且每次添加新操作都需要修改原有…

Linux timerfd 定時器封裝

使用 timerfd epoll() 實現&#xff0c;簡潔精確。沒定義 MU_ERROR 宏的話替換為 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【樣式效果】Vue3實現仿制iOS按鈕動態效果

iOS開關效果定義變量&#xff1a; <style scoped lang"scss">.layout {// 按鈕寬度$button-width: 500px;// 按鈕高度$button-height: 250px;// 按鈕里面圓形直徑$circle-diameter: 200px;// 按鈕背景與里面圓形間距$button-circle-offset:calc(($button-he…

京東瘋狂投資具身智能:眾擎機器人+千尋智能+逐際動力 | AI早報

每日分享全球最新AI資訊【應用商業八卦技術】&#xff0c;&#x1f30f;&#xff1a;未來世界2099應用 1、馬斯克推出兒童AI"Baby Grok"引熱議&#xff1a;安全性能否經受考驗&#xff1f; 2、螞蟻AQ健康應用霸榜蘋果商店&#xff0c;或將聯手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自動外鏈構建技術重構智能營銷新標準

AI時代SEO技術革命&#xff1a;企業如何突破流量增長瓶頸&#xff1f;隨著Google算法升級至MUM模型&#xff0c;傳統SEO工具已難以應對多模態內容優化需求。在搜索引擎日均處理120億次查詢的生態中&#xff0c;企業官網平均自然流量轉化周期長達6-8個月&#xff0c;因此諸如Jia…

Docker-compose:服務編排

Docker-compose 介紹 服務編排:按照一定的業務規則批量管理容器 在微服務架構的應用系統中,一般包含 N 個微服務,且每個微服務一般都會部署多個實例。此時,如果每個微服務都要手動啟停,維護的工作量會很大。 要從 Dockerfile build image 或者去 docker hub 拉取 image …

異地服務器備份Mysql數據

前言異地服務器備份Mysql數據即Mysql的server端與備份服務器不是同一個。Mysql服務端安裝在192.168.3.36中&#xff0c;現在需要在IP為192.168.209.129的服務器中使用mysqldump命令備份指定數據庫數據;192.168.209.129沒有裝過Mysql客戶端;1.安裝Mysql客戶端不安裝Mysql客戶端就…

NGINX 高級配置解析:`proxy_request_buffering` 使用詳解

在使用 NGINX 作為反向代理服務器時&#xff0c;處理客戶端請求體&#xff08;如上傳文件或大體積 POST 請求&#xff09;的方式會直接影響應用性能與資源使用。其中&#xff0c;proxy_request_buffering 是一個非常關鍵但容易被忽略的配置項。 本文將詳細介紹該指令的作用、典…

增加交叉驗證和超參數調優

前文中&#xff0c;只是給了基礎模型&#xff1a; PyTorch 實現 CIFAR-10 圖像分類&#xff1a;從數據預處理到模型訓練與評估-CSDN博客 今天我們增加交叉驗證和超參數調優&#xff0c; 先看運行結果&#xff1a; 在測試集上評估最終模型 最終模型在測試集上的準確率&…

解決pip指令超時問題

用pip指令&#xff0c;在安裝Django3.2時報錯&#xff0c;詢問ChatGpt后得到的解決方案pip 下載超時 —— 是 當前網絡連接到 PyPI 官方源太慢或不穩定&#xff0c;甚至可能連不上了&#xff0c;而 pip 默認的超時時間又太短&#xff0c;就導致了中途失敗&#xff1a;ReadTimeo…

Oracle定時清理歸檔日志

線上歸檔日志滿了&#xff0c;系統直接崩了&#xff0c;為解決這個問題&#xff0c;創建每月定時清理歸檔日志。 創建文件名 delete_archivelog.rman CONFIGURE ARCHIVELOG DELETION POLICY CLEAR; RUN {ALLOCATE CHANNEL c1 TYPE DISK;DELETE ARCHIVELOG ALL COMPLETED BEFORE…

ELF 文件操作手冊

目錄 一、ELF 文件結構概述 二、查看 ELF 文件頭信息 1、命令選項 2、示例輸出 3、內核數據結構 三、ELF 程序頭表 1、命令選項 2、示例輸出 3、關鍵說明 4、內核數據結構 四、ELF 節頭表詳解 查看節頭表信息 1、命令選項 2、示例輸出 3、標志說明 4、重要節說…