在本文中,我们将带你了解js框操作-----Selenium快速入门在这篇文章中,我们将为您详细介绍js框操作-----Selenium快速入门的方方面面,并解答八常见的疑惑,同时我们还将给您一些技巧
在本文中,我们将带你了解js框操作-----Selenium快速入门在这篇文章中,我们将为您详细介绍js框操作-----Selenium快速入门的方方面面,并解答八常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的(一) Cesium for Unreal快速入门(译)、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、Cookie操作-----Selenium快速入门(十一)、golang快速入门(八)数据类型特别之处(下)。
本文目录一览:- js框操作-----Selenium快速入门(八)(js框选)
- (一) Cesium for Unreal快速入门(译)
- c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
- Cookie操作-----Selenium快速入门(十一)
- golang快速入门(八)数据类型特别之处(下)
js框操作-----Selenium快速入门(八)(js框选)
js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt),他们都是模态窗口。什么是模态窗口,大家可以自行百度一下,简单说就是弹出的窗口是在最顶端的,你点击文档,无法切换到文档,它总是在最顶端,最先接受用户的响应,而且这种框同时只能存在一个。这有点像播放器的当播放时总在最前一样。
Selenium中对js框的操作非常简单,js框在Selenium中被抽象成Alert对象,只有四个方法:
void accept() :点击“确定”按钮
void dismiss()
:点击“取消”按钮
Stirng getText()
:获得窗口的提示信息
void sendKeys(String keysToSend)
:在提示框中输入文档
在操作这些框前,当然需要先切换到他们,所以还需知道一个方法:
Alert switchTo().alert() :切换到js框,并且返回一个Alert对象
我们将通过讲解最复杂的提示框来说明Alert对象的用法。
首先,我们在html文件夹中,增加一个html文件,jsWin.html,其中的代码是这样的
<!DOCTYPE html>
<html>
<head>
<meta>
<title></title>
</head>
<body>
<p>点击按钮查看输入的对话框。</p>
<button id="button1" onclick="myFunction()">点我</button>
<p id="demo"></p>
<script>
function myFunction(){
var x;
var person=prompt("请输入你的名字","");
if (person!=null && person!=""){
x="你好 " + person + "! 今天感觉如何?";
document.getElementById("demo").innerHTML=x;
}
}
</script>
</body>
</html>
我们要进行的操作是,点击页面上的按钮,输入“Selenium”,然后按确定
代码如下:
//得到WebDriver
WebDriver driver=DriverHelper.CreateChromeDriver();
driver.get("file:///D:/WorkSpace/SeleniumTest/html/jsWin.html");
//找到页面上的按钮,并点击弹出提示框
driver.findElement(By.id("button1")).click();
Thread.sleep(1000);
Alert prompt = driver.switchTo().alert();
//输出提示框的提示信息,此处最后输出“请输入你的名字”
System.out.print(prompt.getText());
Thread.sleep(1000);
//在提示框的文本框中,输入Selenium,并点击确定
prompt.sendKeys("Selenium");
prompt.accept();
最后的运行效果如下:
(一) Cesium for Unreal快速入门(译)
原文请参考Cesium官方文档:Cesium for Unreal Quickstart。
译者注:如果您做过Web前端可视化、WebGL、GIS相关的开发工作,您肯定听说过Cesium。
Cesium是一个开源的三维GIS平台,用卫星地图、地形、建筑白膜、倾斜摄影、点云等数据还原真实的三维地球。
2020-05-28日,虚幻官方论坛发过From Ants to Outer Space (opens new window)的文章,作者用非常tricky的方式模拟了从地面上的一个小蚂蚁飞到外太空看地球的场景。
早期Cesium提供了Javascript语言的CesiumJS框架,如今Cesium for Unreal于2021-03-30正式发布,让虚幻引擎具有了Google Earth (opens new window)的能力,为模拟真实世界打开了一扇新的大门。
这是一份关于用Cesium World Terrain和Cesium OSM Buildings创建Cesium for Unreal应用的快速入门教程。(译者注:需要您具有基本的虚幻引擎使用技能,懂一点C++更好。关于虚幻引擎的基本技能,请参考官方 在线学习教程):
- 初识虚幻引擎
- 虚幻引擎入门
- 理解项目和文件结构
- 虚幻引擎编辑器基础——编辑器入门
- 蓝图:基础概念
- 虚幻编辑器基础——材质
- 材质:基础概念
- 了解可视化设计中的材质
- 将蓝图转换为C++
用Cesium World Terrain和Cesium OSM Buildings创建的韩国首尔在虚幻引擎中的场景
您将学会如何:
- 在虚幻引擎中安装Cesium for Unreal插件
- 添加一个关卡并且从Cesium ion导入资产
- 在Cesium for Unreal应用中添加照片级的光照效果
准备工作
- 安装虚幻引擎(至少需要4.26或以上版本)。关于如何安装虚幻引擎,请访问虚幻引擎下载页面。
一个Cesium ion帐号,用于将地形和建筑物资产流式传输到虚幻引擎中。如果您还没有免费的Cesium ion帐号,请注册 一个。
Cesium ion是一个用于流式传输和托管3D内容的开放平台,并且包含全球的、精准的GIS数据,可用于创建展示真实三维地球的应用程序。
第一步:安装Cesium for Unreal插件
如果尚未安装,请先安装Cesium for Unreal插件。
- 在虚幻引擎市场上打开Cesium for Unreal插件页面。
- 登录虚幻引擎商城,并单击免费按钮,将插件安装在虚幻引擎中。
第二步:安装Cesium for Unreal插件
- 启动虚幻引擎,并创建一个新项目。在选择游戏模板界面选择游戏。
在项目设置中选择不带初学者内容包,以避免不必要的内容使关卡混乱。选择新项目路径,修改项目名称后,点击创建项目。 - 激活Cesium for Unreal插件。打开菜单编辑->插件,然后在插件窗口右上角的搜索栏中搜索cesium。确保Cesium for Unreal插件的已启用复选框已勾选。启用插件后,重新启动虚幻引擎。
- 打开菜单文件->新建关卡,选择关卡。
- 打开菜单文件->保存当前关卡,选择存储路径,将新关卡命名为QuickStart。(译者注:关于命名规则,请参考UE4 Style Guide)
- 打开菜单编辑->项目设置,再选择项目->地图和模式。将编辑器开始地图和游戏默认地图设置为刚创建的关卡QuickStart。这样可以确保在重新启动虚幻编辑器时自动重新打开您的关卡。
第三步:添加SunSky照明和FloatingPawn
CesiumSunSky蓝图给室外场景增加了炫酷的天阳光照明,它扩展了内置的SunSky蓝图,让它跟真实地球上的太阳光一模一样。同样,Cesium的FloatingPawn扩展了内置的FloatingPawn,使其能在地球上任意移动,并允许使用鼠标滚轮控制移动速度,特别是距离地面很远时非常有用(用键盘WSAD前后左右移动,鼠标控制方向,滚轮控制移动速度)。
当视角在Cesium地球上方的不同位置之间飞行时,照相机应遵循与地球表面平行的弯曲路径,而不是线性的点对点飞行轨迹。Cesium的FloatingPawn就是做这个用的,它确保你从地球的一边飞到地球的另外一边时,向上的方向始终从地球的球心指向天空(直观的理解就是:因为地球是园的,不是平的,所以虚幻引擎默认的相机移动方式就不行了)。
- 打开菜单编辑->项目设置,然后搜索luminance(或者参考下图)。确保启用了扩展自动曝光设置中的默认亮度范围选项。如果未启用此选项,则在阳光直射的情况下,用SunSky照明会完全曝光,界面白茫茫一片。启用此选项后,需要重新启动虚幻引擎。
- 单击内容浏览器右下角的视图选项,并确保同时勾选了显示引擎内容和显示插件内容。
- 在内容浏览器中,单击选择路径按钮,搜索Cesium,或者向下滚动以查找并单击CesiumForUnreal内容。
- 将CesiumSunSky和FloatingPawn蓝图拖动到关卡视口中。
第四步:在关卡开始时自动拥有FloatingPawn
在上面的步骤中,您将FloatingPawn添加到了关卡中,但是玩家还不能控制它,还需要执行下列步骤才能使用它在世界各地移动。
- 在世界大纲视图中选择FloatingPawn。
- 设置游戏开始时,玩家0自动控制FloatingPawn:在细节面板中,搜索possess,点击自动控制玩家旁边的下拉菜单,然后选择玩家0。
第五步:连接到Cesium ion
- 通过单击工具栏中的Cesium图标来打开Cesium面板。
- 点击Connect按钮,连接到Cesium ion。这时浏览器会自动打开,要求您允许Cesium for Unreal使用Cesium ion中当前登录的帐户访问您的资产:
选择Allow并返回虚幻引擎以继续下一步。
第六步:创建一个地球
在此步骤中,您将使用Cesium ion的资产填充场景。
- 通过单击工具栏中的Cesium按钮来打开Cesium面板。在Quick Add中,单击Cesium World Terrain + Bing Maps Aerial imagery右侧的加号(可以随意添加其他Cesium World Terrain + imagery组合之一)。
此步骤将在世界大纲视图中生成新的Cesium World Terrain和CesiumGeoreference蓝图对象。 - 地平线附近可能会有一条黑条。要解决此问题,请选择CesiumGeoreference对象,在细节面板中找到Sun Sky,然后使用刚创建的CesiumSunSky对象对其进行初始化。
一旦将CesiumSunSky对象连接到CesiumGeoreference对象,便会自动修改其纬度和经度属性,以使地球和太阳保持同步。
- 如果场景太暗,请调整CesiumSunSky对象上的Solar Time属性,比如设置一个美丽的日落场景。您可能还想更改时区Time Zone。
有关这些属性如何工作的更多信息,请访问虚幻引擎文档站点上的SunSky对象文档。
第七步:将全球三维白膜建筑(OSM Buildings)添加到场景中
在此步骤中,您将在Cesium World Terrain上面添加Cesium OSM Buildings。与步骤六相似,您将使用编辑器中的Cesium面板添加新资产。
- 导航回到虚幻引擎中的Cesium面板。您将使用Cesium ion Assets窗口来添加Cesium OSM Buildings ,而不是像上一步那样使用Quick Add窗口。单击左上角的Add按钮以切换到Cesium ion Assets窗口(此窗口默认在左下方,在内容浏览器页签右边)。在这里,您将看到Cesium ion帐户中存在的所有资产。
选择Cesium OSM Buildings,然后单击Add Add to Level。
然后您将看到Cesium OSM Buildings现在已添加到世界大纲视图中。如果Cesium ion Assets中没有Cesium OSM Buildings,请访问Cesium OSM Buildings (opens new window)资产仓库页面,然后单击Add按钮添加到我的资产。然后返回虚幻引擎,关闭Cesium ion Assets面板,然后再次单击Cesium面板上的Add按钮以重新打开并刷新资产列表。
- 如果您看不到建筑物,那么您可能在地球上没有建筑物的地方。要导航到地球的某个地方,请在世界大纲视图中选择CesiumGeoreference对象,在细节面板中,在Cesium类别下找到原点经度Origin Longitude,原点维度Origin Latitude和原点高度Origin Height属性。
将这些属性调整为您想要的值。例如,以下建筑物位于美国伊利诺伊州芝加哥市,经度-87.629799,纬度41.878101,高度2250.0。
设置CesiumGeoreference原点后,编辑器相机将立即跳转到那里。但是,尽管原点发生了变化,但FloatingPawn会进行自我调整,以保持其在地球上的先前位置。当你点击运行按钮时,如果您想在芝加哥开始,在世界大纲视图中选中FloatingPawn,设置其位置为(0,0,0)。 - 点击工具栏运行按钮,然后使用键盘W,A,S和D键以及鼠标在地球上漫游!用鼠标滚轮可以控制飞行速度。当相机离地面近时,往下滚动鼠标滚轮降低飞行速度;当相机离地面远时,向上滚动鼠标滚轮增加飞行速度。在编辑器中,还可以用右上角的控件修改相机移动速度。
下一步
现在,您可以添加更多资产并自定义场景了!继续添加倾斜摄影资产(敬请期待)。
c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
这是DefaultSelenium的构造函数:
ISelenium sele = new DefaultSelenium(**serveraddr**,**serverport**,browser,url2test); sele.Start(); sele.open(); ...
似乎我必须在创建ISelenium对象之前安装Selenium Server.
我的情况是,我正在尝试使用C#Selenium构建一个.exe应用程序,它可以在不同的PC上运行,并且不可能在所有PC上安装Selenium Server(你永远不知道哪个是下一个运行应用程序).
有没有人知道如何在不安装服务器的情况下使用ISelenium / DefaultSelenium?
谢谢!
解决方法
1)对于selenium浏览器启动:
DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setbrowserName("safari"); CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"),new URL("http://www.google.com/"),capabilities); WebDriver driver = new RemoteWebDriver(executor,capabilities);
2)对于selenium命令:
// You may use any WebDriver implementation. Firefox is used here as an example WebDriver driver = new FirefoxDriver(); // A "base url",used by selenium to resolve relative URLs String baseUrl = "http://www.google.com"; // Create the Selenium implementation Selenium selenium = new WebDriverBackedSelenium(driver,baseUrl); // Perform actions with selenium selenium.open("http://www.google.com"); selenium.type("name=q","cheese"); selenium.click("name=btnG"); // Get the underlying WebDriver implementation back. This will refer to the // same WebDriver instance as the "driver" variable above. WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver(); //Finally,close the browser. Call stop on the WebDriverBackedSelenium instance //instead of calling driver.quit(). Otherwise,the JVM will continue running after //the browser has been closed. selenium.stop();
描述于此:http://seleniumhq.org/docs/03_webdriver.html
谷歌在C#中有类似的东西.没有其他方法可以实现这一目标.
Cookie操作-----Selenium快速入门(十一)
什么是cookie?顾名思义,就是饼干,小甜饼。而根据读音则是“曲奇”的意思,相信不少的人都吃过。而在网络上,cookie是指浏览器在本地的一种少量数据的存储方式。例如,我们常见的,登陆的时候有个checkbox选项,上面写着“记住我”,这个功能的实现靠的就是cookie。如果你之前未接触过cookie,更多的的信息,请自行百度。
Selenium操作cookie非常简单,操作的方法主要有:
返回类型 | 方法和说明 |
---|---|
void |
addCookie(Cookie cookie) 添加一个cookie |
void |
deleteAllCookies() 删除当前域名下的所有cookie |
void |
deleteCookie(Cookie cookie) 删除一个cookie |
void |
deleteCookieNamed(java.lang.String name) 删除一个cookie,参数是cookie名 |
Cookie |
getCookieNamed(java.lang.String name) 通过名字得到cookie |
java.util.Set<Cookie> |
getCookies() 获得当前域名下的所有cookie |
下面直接通过实例来说明对cookie的操作。
首先,我们需要安装Web服务器,我在win10上安装了iis,并在默认网站根目录增加两个文件,cookie1.html和cookie2.html,这两个html的作用就是模拟用户登陆。
cookie1.html的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
//设置cookie
function setCookie(c_name, value, expiredays) {
var exdate = new Date()
exdate.setDate(exdate.getDate() + expiredays)
document.cookie = c_name + "=" + escape(value) +
((expiredays == null) ? "" : ";expires=" + exdate.toGMTString())
}
//登陆,并保存账号密码到cookie,然后跳转到cookie2.html
function login() {
var userName = document.getElementById("userNameInput").value;
var pwd = document.getElementById("pwdInput").value;
setCookie("UserName", userName, 1);
setCookie("Pwd", pwd, 1);
document.location.href="cookie2.html"
}
</script>
</head>
<body >
<p>用户名:<input type="text" id="userNameInput" /></p>
<p>密码:<input type="password" id="pwdInput" /></p>
<p><input type="button" id="login" value="登陆" onclick="login()" /></p>
</body>
</html>
cookie1.html有两个js的函数,一个是设置cookie,一个是模拟登陆,登陆成功后,跳转到cookie2.html
以下是cookie2.html的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
//获得cookie
function getCookie(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=")
if (c_start != -1) {
c_start = c_start + c_name.length + 1
c_end = document.cookie.indexOf(";", c_start)
if (c_end == -1) c_end = document.cookie.length
return unescape(document.cookie.substring(c_start, c_end))
}
}
return ""
}
//检查cookie,如果存在,则登陆成功,否则登陆失败
function init() {
var userName = getCookie("UserName");
var pwd = getCookie("Pwd");
if (userName)
document.write("登陆成功,欢迎:" + userName + ";您的密码是:" + pwd);
else
document.write("登陆失败!");
}
</script>
</head>
<body onload="init()">
</body>
</html>
cookie2.html也有两个js函数,一个是读取cookie,另一个是检查cookie是否存在,如果存在,则表示登陆成功,否则登陆失败。
以下是执行的代码:
System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver();
//跳转到html
driver.get("http://localhost/cookie1.html");
//默认最多等待1秒
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
//模拟手动登陆
driver.findElement(By.id("userNameInput")).sendKeys("jack");
driver.findElement(By.id("pwdInput")).sendKeys("122345");
driver.findElement(By.id("login")).click();
//当跳转到cookie2.html时,我们获取所有cookie,并打印出来
WebDriverWait wait=new WebDriverWait(driver, 5);
if(wait.until(ExpectedConditions.urlContains("cookie2.html")))
{
Set<Cookie> cookies=driver.manage().getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie);
}
}
执行的效果如下:
而我们打印出来的cookie是这样的:
如果我们直接访问cookie2.html,因为没有带cookie,效果是这样的:
我们从打印出来的cookie,自行构建cookie,然后让driver带上,看看效果如何。
以下是代码:
System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver();
//必须先跳转到该地址,否则addCookie方法出错
driver.get("http://localhost/cookie2.html");
//构造cookie,也可以将之前的cookie保存到文件,然后再读出来,此处为了方便,直接构建cookie
Cookie cookie1=new Cookie("UserName", "jack", "localhost", "/", new Date(System.currentTimeMillis()+60*60*24*1000), false);
Cookie cookie2=new Cookie("Pwd", "122345", "localhost", "/", new Date(System.currentTimeMillis()+60*60*24*1000), false);
//让driver带上cookie
driver.manage().addCookie(cookie1);
driver.manage().addCookie(cookie2);
//刷新
driver.get("http://localhost/cookie2.html");
执行后的效果:
可见,通过selenium的cookie操作,我们可以进行模拟登陆,这个是十分常见的技巧,更多的情况,我们是将获得的cookie保存到文件或数据库中,然后登陆的时候,读取出来,让driver带上。
golang快速入门(八)数据类型特别之处(下)
二、 golang 复合数据类型特别之处
复合数据类型也是由基础数量类型构造出来的,golang中主要有数组、slice(切片)、map和结构体四种。数组和结构体都是有固定内存大小的数据结构。相比之下,slice和map则是动态的数据结构,它们将根据需要动态增长。
1. 数组
数组定义定义及初始化,数组长度是固定的,且为常量,在编译时已确定。
var q [3]int = [3]int{1,2,3}
q := [...]int{1,3} // 或通过...占位,自动计算个数
可通过range
在遍历数组的索引和值。
var a [3]int
for index,value := range a {
fmt.Printf("%d %d\n",index,value)
}
// 仅获取value
for _,value := range a {
fmt.Printf(""%d\n",value)
}
向函数传递数组时不允许在函数内部修改底层数组的元素。
main(){
num := [3]int{1,3}
myInt := 100
changeNum(myInt,num)
fmt.Println(num[0],myInt)
}
func changeNum(myInt int,num [3]int) {
num[0] = 0
myInt++
}
//output
1 100
我们传入changeNum函数一个变量和数组,底层数组数据均未被修改。在golang中函数参数变量接收的是一个复制的副本,并不是原始调用的变量。如果要通过数组修改底层数组数据可以像其他语言一样传入数组指针。
main(){
num := [3]int{1,3}
changeNumPoint(&num)
fmt.Println(num[0])
}
func changeNumPoint(num *[3]int) {
num[0] = 0
}
//output
0
2.slice
切片,和python中切片相似度较高,slice相比数组,其长度是可扩展的,slice创建一个合适大小的数组,然后slice的指针指向底层的数组。
slice 内部结构体
struct Slice
{
byte* array; // actual data
uintgo len; // number of elements
uintgo cap; // allocated number of elements
};
第一个指针是指向底层数组,后面是slice的长度和容量。在底层,make创建了一个匿名的数组变量,然后返回一个slice;只有通过返回的slice才能引用底层匿名的数组变量。我们可使用内建make创建slice。
make([]T,len,cap) //cap省缺于len值相同
slice长度: 切片包含的元素个数。
slice容量: 从它的第一个元素开始数,到其底层数组元素末尾的个数。使用append添加数据时,容量小于长度时会自动扩展为原来两倍。
slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素,上文提到数组传入函数是以副本形式。
main(){
sliceNum := []int{4,5,6}
changeSlice(sliceNum)
fmt.Println(sliceNum[0]
}
func changeSlice(sliceNum []int) {
sliceNum[0] = 0
}
//output
0
使用append追加多个元素:
x = append(x,4,6)
copy(dest,src),对位复制。
slice1 := []int{1,3,5}
slice2 := []int{6,7,8}
copy(slice2,slice1)
3.Map
哈希表,类似于python中dic字典,map是一个无序的key/value对的集合。
通slice一样,可以使用make创建一个map,也可以通过range遍历:
ages := make(map[string]int){"key":value}
通过key作为索引下标来访问map将产生一个value。如果key在map中是存在的,那么将得到与key对应的value;如果key不存在,那么将得到value对应类型的零值。我们可以通过这个值来判断key索引的value是否存在。
age,ok := ages["key"]
if !ok { ... }
//可以优化为
if age,ok := ages["bob"]; !ok { ... }
map的比较
func equal(x,y map[string]int) bool {
if len(x) != len(y) {
return false
}
for k,xv := range x {
if yv,ok := y[k]; !ok || yv != xv {
return false
}
}
return true
}
使用map做统计
var m = make(map[string]int)
func k(list []string) string { return fmt.Sprintf("%q",list) }
func Add(list []string) { m[k(list)]++ }
func Count(list []string) int { return m[k(list)] }
4.结构体
结构体定义
type Point struct {
Salary int
ManagerID int
}
var p Point //结构体变量
//另一种写法
type Point struct{ X,Y int }
p := Point{1,2}
和变量、函数一样,构体成员名字是以大写字母开头的,那么该成员就是导出的。一个结构体可能同时包含导出和未导出的成员。
结构体作为函数的参数和返回值:
func Scale(p Point,factor int) Point {
return Point{p.X * factor,p.Y * factor}
}
fmt.Println(Scale(Point{1,2},5)) // "{5 10}"
指针的方式(提高效率),可以在函数中修改结构体成员。
func AwardAnnualRaise(e *Employee) {
e.Salary = e.Salary * 105 / 100
}
结构体嵌套,使定义简化和清晰。
//点
type Point struct {
X,Y int
}
//圆
type Circle struct {
Center Point
Radius int
}
//轮
type Wheel struct {
Circle Circle
Spokes int
}
访问成员
var w Wheel
w.Circle.Center.X = 8
w.Circle.Center.Y = 8
w.Circle.Radius = 5
w.Spokes = 20
显然要访问多层结构体较为复杂,go还提供了匿名成员
来处理结构嵌套。匿名成员的数据类型必须是命名的类型或指向一个命名的类型的指针。
我们修改圆和轮为如下:
type Circle struct {
Point
Radius int
}
type Wheel struct {
Circle
Spokes int
}
访问成员:
var w Wheel
w.X = 8
w.Y = 8
w.Radius = 5
w.Spokes = 20
从上面来看匿名成员特性只是对访问嵌套成员的点运算符提供了简短的语法糖。,其实在go中匿名成员并不要求是结构体类型;其实任何命名的类型都可以作为结构体的匿名成员。这个机制可以用于将一些有简单行为的对象组合成有复杂行为的对象。组合会在go面向对象中会大展拳脚。
文章有不足的地方欢迎在评论区指出。
欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。
关于js框操作-----Selenium快速入门和八的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于(一) Cesium for Unreal快速入门(译)、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、Cookie操作-----Selenium快速入门(十一)、golang快速入门(八)数据类型特别之处(下)的相关知识,请在本站寻找。
本文标签: